Head First 设计模式--Command

chapter 6 --命令模式

                                  封装调用

 

1. 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。

 

 

命令模式:

 

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

 

Command pattern

Structure

  • Client: 客户负责创建一个ConcreteCommand,并设置其接收者。
  • ConcreteCommand: 定义了动作和接收者之间的绑定关系。调用者只要调用execute()就可以发出请求,然后由ConcreteCommand调用接收者的一个或多个动作。这个execute()方法会调用接收者的动作,以满足请求。
  • Receiver: 接收者知道如何进行必要的工作,实现这个请求。任何类都可以当做接收者。
  • Command: 为所有命令声明了一个接口。调用命名对象的execute()方法,就可以让接收者进行相关的动作。这个接口也具备一个undo()方法。
  • Invoker: 这个调用者持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。

 

空对象

当你不想返回一个有意义的对象时,空对象就很有用。客户也可以将处理null的责任转移给空对象。当调用空对象的execute()的方法时,这种对象什么事情都不做。例如,代码中的NoCommand对象是一个空对象(null object)。有时候,空对象本身也被视为一种设计模式。

 

 

2. 利用Command接口,每个动作都被实现成一个简单的命令对象。命令对象持有对一个厂商类的实例的引用,并实现了一个execute()方法。这个方法会调用厂商类实例的一个或多个方法,完成特定的行为。

 

3. 可以使用一个堆栈记录操作过程的每一个命令。然后,不管什么时候按下了撤销按钮,你都可以从堆栈中取出最上层的命令,然后调用它的undo()方法。从而实现多层次的撤销操作。

 

4. 命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样。它甚至可以在不同的线程中被调用。我们可以利用这样的特性衍生一些应用:日程安排(Scheduler)、线程池、工作队列等。

 

5. 工作队列:你在某一端添加命令,然后另一端则是线程。线程从队列中取出一个命令,调用它的execute()方法,等待这个调用完成后,然后将此命令对象丢弃,再取出下一个命令。这样,工作队列类与进行计算的对象之间完全是解耦的。工作队列对象不在乎到底做什么,它们只知道取出命令对象,然后调用其execute()方法。

 

6. 命令模式也可用于日志请求,当执行命令时,将历史记录存储在磁盘中。一旦系统死机,就可以将命令对象重新加载,并成批地依次调用这些对象的execute()方法。

 

 

本章小结:

  • 命令模式将发出请求的对象和执行请求的对象解耦。
  • 在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
  • 调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用。
  • 调用者可以接受命令当做参数,甚至在运行时动态地进行。
  • 命令可以支持撤销,做法是实现一个undo()方法来回倒execute()被执行前的状态。
  • 宏命令是命令的一种简单的延伸(使用数组存储一组命令),允许调用多个命令。宏方法也可以支持撤销。
  • 实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
  • 命令也可以用来实现日志和事务系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值