10 Command命令模式(行为型)
10 Command(行为型)
-
- 命令也是类
- 命令模式把一个请求封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
- As known as :Action 、Transaction
- 有时,有必要向对象发出请求,而不知道请求的操作或请求的接收者。
- 什么时候用:
- 来取代回调函数:把函数指针地址作为参数给调用的函数
- 在不同的时间指定、排队和执行请求
- 执行undo
- 命令的执行操作可以存储状态,以便在命令本身中反转其效果 (撤销)
- 执行的命令存储在历史列表中
- 无限制级别的撤销和重做是通过前后遍历这个列表来实现的
分别取消执行和执行。
-
- 持久化log,把命令存在日志里,可以redo,undo
- 添加带有Load和Store的命令接口,您可以保存更改的持久日志。
- 它们可以在系统崩溃时重新应用。
- 从崩溃中恢复需要从磁盘加载日志命令,并通过执行操作重新执行它们。
- 持久化log,把命令存在日志里,可以redo,undo
-
- 支持事务,要么不做,要么全做
-
- 命令模式:将发送命令和执行命令的职责分开,将命令委托给不同的对象
- 满足的原则:
- 单一职责原则
- 开放封闭原则
如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象
-
- 每一个命令是一个操作
- 调用程序发送一个作为请求操作的命令,接收程序接受命令并执行操作
- 调用程序独立于接收器,以及也独立于命令何时、何地、如何执行。
- client创建具体的命令对象
- invoker存储具体指令对象
- 调用程序通过调用Execute命令发出请求。
当命令不可执行时,ConcreteCommand在调用执行之前保存状态,以便撤销命令。
-
- 在concrete command对象中,调用其接收器上的操作来执行请求。
- 顺序图:
- 结果:
- Invoker和receiver解耦了
- 可以构建复合命令(沏茶,准备凳子…)
- 添加新命令很容易
- 很容易实现redo,undo
- 宏命令macro command
-
- 如此以上的步骤通过宏命令实现了一键开party——开灯,开tv,开热水浴缸,开立体声
-
- 其他用法:
- 命令为我们提供了一种方法,可以打包一段计算并传递它。在某个客户端应用程序创建command对象很久之后,可以调用计算本身。应用:调度程序、线程池、作业队列
- Logging request
- 一些应用程序的语义要求我们记录所有的动作,并且能够通过重新调用这些动作在崩溃后恢复
- command怎么这么聪明呢:
- 在一种极端情况下,它仅仅定义了接收者和执行请求的操作之间的绑定。
- 有时命令有足够的知识来动态地找到接收者。
- 在另一种极端情况下,它不需要委托给接收者就可以实现所有东西。
- 当(1)您想要定义独立于现有类的命令时,(2)当不存在合适的接收器时,或者(3)当命令隐式地知道它的接收器时,它是有用的。
- 在一种极端情况下,它仅仅定义了接收者和执行请求的操作之间的绑定。
- 其他用法: