意图和动机
意图
- 将请求封装为对象,用不同请求对客户参数化
- 对请求排队或记录请求日志,支持可取消的操作
动机
- 对请求排队或记录请求日志,支持可取消的操作,对请求排队或记录请求日志,支持可取消的操作,只需在程序运行时指定具体的请求接收者即可
- 只需在程序运行时指定具体的请求接收者即可
适用性
- 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
- 系统需要在不同的时间指定请求、将请求排队和执行请求
- 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
- 系统需要将一组操作组合起来, 即支持宏命令
结构和参与者
- Command:声明执行操作的接口
- Client(Application):创建一个具体命令对象并设定它的接受者
- ConcreteCommand:将一个接收者对象绑定于一个动作调用接收者相应操作,实现Execute
- Invoker(MenuItem):要求该命令执行这个请求
- Receiver(Document):知道如何实施与执行一个请求相关的操作
协作
- Client创建一个ConcreteCommand对象并指定它的Receiver对象
- 某Invoker对象存储该ConcreteCommand对象
- 该Invoker通过调用Command对象的Execute操作来提交一个请求
- ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求
效果
- 请求者不直接与接收者交互,即请求者不包接收者的引用,彻底消除了彼此之间的耦合
- Command对象可像其他的对象一样被操纵
和扩展 - 可将多个命令装配成一个复合命令,复合命
令是Composite模式的一个实例 - 满足OCP,增加新的Command很容易,因
为这无需改变已有的类