命令模式

命令模式

Scroll Down

命令模式将一个请求封装成一个对象,解耦调用操作的对象与接收命令的对象,该模式可以支持请求排队并方便的记录请求日志,以及支持可撤销的操作

结构

commandPattern.jpg

参与者

  • Command(具体执行操作都必须实现的接口)

    • 命令对象实现这个接口
    • 调用接受者响应的操作,以实现execute方法
  • Client(发起命令请求的对象)

    • 创建一个具体的命令对象并设定它的接收者
  • Invoker(委托命令执行请求的控制器)

    • 持有一个或多个命令请求
    • 该对象的结构将会随着业务组合形式的变化而变化(宏命令)
  • Receiver(命令的接受者)

    • 实现具体命令请求操作
    • 被委托执行具体的命令

协作

  1. Client创建一个ConcreteCommand对象并指定它的Receiver对象
  2. 使用Invoker对象存储该ConcreteCommand对象
  3. 通过该Invoker调用Command对象的Execute操作来提交请求,如果该请求可撤销,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令
  4. ConcreteCommand对象调用它的Receiver的一些操作以执行该请求

优点

  1. 解耦调用操作的对象与接收命令实现具体行为的对象
  2. Command对象可以被扩展和复用
  3. 可将多个命令装配成一个宏命令

适用范围

  1. 命令对象有足够的信息可以动态的找到它们的接收者 当命令没有合适的接收者时,或者一个命令隐式地知道它的接收者时,命令对象可以实现所有功能
  2. 操作需要支持取消和重做 当支持取消与重做是,ConcreteCommand对象需要根据需求记录必须的具体历史操作来支持取消和重做,如果要支持多级的取消和重做,就需要有一个已被执行命令的历史列表,这时还要考虑如何避免多级取消与重做过程中可能产生的错误积累