1、意图
将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤消的操作。
2、适用性
在以下情况下使用
(1)抽象出待执行的动作以参数化某对象。你可用过程语言中的回调函数表达这种参数化机制。
(2)在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
(3)支持取消操作。
(4)支持修改日志,这样当系统崩溃时,这些修改可能被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们
(5)用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务的信息系统中很常见。
3、参与者
(1)Command:声明执行操作的接口
(2)ConcreteCommand:将一个接收者对象绑定于一个动作
(3)Client:创建一个具体命令并设定它的接收者
(4)Invoker:要求该命令执行这个请求
(5)Receiver:知道如何实施与执行一个请求相关的操作。
4、协作
(1)Client创建一个ConcreteCommand对象并指定它的Receiver对象
(2)某Invokder对象存储该ConcreteCommand对象
(3)该 Invoker通过调用Command对象的Execute操作来提交一个请求。
(4)ConcreteCommand对象调用它的Receiver的一些操作以执行该请求。
5、效果
(1)Command模式将调用操作的对象与知道如何实现该操作的对象解耦
(2)Command是头等的对象。它们可像其他的对象一样被操纵和扩展
(3)你可将多个命令装配成一个复活命令。
(4)增加新的Command很容易,因为这无需改变已有的类。