命令模式将一个请求封装成一个对象,解耦调用操作的对象与接收命令的对象,该模式可以支持请求排队并方便的记录请求日志,以及支持可撤销的操作
结构
参与者
-
Command(具体执行操作都必须实现的接口)
- 命令对象实现这个接口
- 调用接受者响应的操作,以实现execute方法
-
Client(发起命令请求的对象)
- 创建一个具体的命令对象并设定它的接收者
-
Invoker(委托命令执行请求的控制器)
- 持有一个或多个命令请求
- 该对象的结构将会随着业务组合形式的变化而变化(宏命令)
-
Receiver(命令的接受者)
- 实现具体命令请求操作
- 被委托执行具体的命令
协作
- Client创建一个ConcreteCommand对象并指定它的Receiver对象
- 使用Invoker对象存储该ConcreteCommand对象
- 通过该Invoker调用Command对象的Execute操作来提交请求,如果该请求可撤销,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令
- ConcreteCommand对象调用它的Receiver的一些操作以执行该请求
优点
- 解耦调用操作的对象与接收命令实现具体行为的对象
- Command对象可以被扩展和复用
- 可将多个命令装配成一个宏命令
适用范围
命令对象有足够的信息可以动态的找到它们的接收者
当命令没有合适的接收者时,或者一个命令隐式地知道它的接收者时,命令对象可以实现所有功能操作需要支持取消和重做
当支持取消与重做是,ConcreteCommand对象需要根据需求记录必须的具体历史操作来支持取消和重做,如果要支持多级的取消和重做,就需要有一个已被执行命令的历史列表,这时还要考虑如何避免多级取消与重做过程中可能产生的错误积累