10 Command命令模式(行为型)

版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86622212

10 Command(行为型)

 

 

    • 命令也是类
    • 命令模式把一个请求封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
    • As known as :Action 、Transaction
    • 有时,有必要向对象发出请求,而不知道请求的操作或请求的接收者。
    • 什么时候用:
      • 来取代回调函数:把函数指针地址作为参数给调用的函数
      • 在不同的时间指定、排队和执行请求
      • 执行undo
        • 命令的执行操作可以存储状态,以便在命令本身中反转其效果 (撤销)
        • 执行的命令存储在历史列表中
        • 无限制级别的撤销和重做是通过前后遍历这个列表来实现的

分别取消执行和执行。

 

    • 持久化log,把命令存在日志里,可以redo,undo
      • 添加带有Load和Store的命令接口,您可以保存更改的持久日志。
      • 它们可以在系统崩溃时重新应用。
      • 从崩溃中恢复需要从磁盘加载日志命令,并通过执行操作重新执行它们。

 

    • 支持事务,要么不做,要么全做
    • 命令模式:将发送命令和执行命令的职责分开,将命令委托给不同的对象
    • 满足的原则:
      • 单一职责原则
      • 开放封闭原则

如果增加新的具体命令和该命令接受者,不必修改调用者的代码,调用者就可以使用新的命令对象

 

 

    • 每一个命令是一个操作
    • 调用程序发送一个作为请求操作的命令,接收程序接受命令并执行操作
    • 调用程序独立于接收器,以及也独立于命令何时、何地、如何执行。
    • client创建具体的命令对象
    • invoker存储具体指令对象
    • 调用程序通过调用Execute命令发出请求。

当命令不可执行时,ConcreteCommand在调用执行之前保存状态,以便撤销命令。

    • 在concrete command对象中,调用其接收器上的操作来执行请求。
    • 顺序图:
      • 结果:
        • Invoker和receiver解耦了
        • 可以构建复合命令(沏茶,准备凳子…)
        • 添加新命令很容易
        • 很容易实现redo,undo
    • 宏命令macro command

 

    • 如此以上的步骤通过宏命令实现了一键开party——开灯,开tv,开热水浴缸,开立体声
    • 其他用法:
      • 命令为我们提供了一种方法,可以打包一段计算并传递它。在某个客户端应用程序创建command对象很久之后,可以调用计算本身。应用:调度程序、线程池、作业队列
      • Logging request
        • 一些应用程序的语义要求我们记录所有的动作,并且能够通过重新调用这些动作在崩溃后恢复
      • command怎么这么聪明呢:
        • 在一种极端情况下,它仅仅定义了接收者和执行请求的操作之间的绑定。
          • 有时命令有足够的知识来动态地找到接收者。
        • 在另一种极端情况下,它不需要委托给接收者就可以实现所有东西。
          • 当(1)您想要定义独立于现有类的命令时,(2)当不存在合适的接收器时,或者(3)当命令隐式地知道它的接收器时,它是有用的。

 

 

猜你喜欢

转载自blog.csdn.net/qq_41997479/article/details/86622212
今日推荐