我们第一次解除命令模式是在第一季的时候,决定版架构总的Command对象撑起了整个Controller的交互逻辑的职责。

其职责如下:

  • 操作Model、System
  • 可以发送Event

命令模式定义

最开始,我们学习了命令模式的定义,如下:

  • 将请求封装成对象,可以将客户端的不同请求参数化,并配合队列、记录、复原等方法来执行请求操作。

接着简单聊了一下架构中的Command,其优点如下

  • 专注操作Model与System,使Controller不再那么臃肿
  • 逻辑以对象为单位进行管理,可以实现比较复杂的功能

命令模式的参数化和撤销

Command参数化非常简单,仅仅只是在Command构造上传参即可。

接着我们用Command实现了撤销功能,也非常简单,仅仅是在ICommand上增加Undo即可。

命令与执行隔离

我们从命令与执行隔离的角度介绍了:方法、事件机制、Command的实现,三者区别如下:

  • 方法:命令与执行在一起(没有分离)
  • Command:执行在Command内部实现(有分离)
  • 事件机制:执行在事件注册中实现(有分离)

以上是空间上的隔离,我们还介绍了时间上的隔离,比如Command之间的隔帧执行和延时执行等。

经典命令模式

  • Invoker:调用者,管理者
  • Receiver:接受者
  • Command:接口
  • ConcreteCommand:实现

经典命令模式的优点

  • Invoker和Receiver解耦
  • 可以扩展Command
  • Invoker可以做定制,可以支持:队列、记录、复原、行为树等。

命令模式与开闭原则

  • 一个类应该对扩展开放、对修改关闭

并且用开闭原则去分析了一般的命令系统,如下:

  • Invoker:关闭修改
  • Receiver:关闭内部修改,开放实现与方法的扩展
  • Command:扩展的标准
  • ConcreteCommand:开放实现的扩展