命令模式的原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

命令模式的原理
命令模式是一种行为设计模式,旨在将请求封装为对象,从而使我们可以使用不同的请求、队列、或日志来参数化其他对象。

命令模式也使我们能够支持撤销操作。

基本结构:
命令模式主要包含以下四个角色:
1. Command(抽象命令类):定义了一个抽象命令类,其中包含了命令的基本属性及行为,具体的命令对象需要实现该抽象类。

2. ConcreteCommand(具体命令类):实现了抽象命令类中的方法,具体实现执行这个命令所执行的操作。

3. Receiver(接收者类):知道如何真正实施和执行一个请求相关的操作,任何类都可以成为一个接收者,是否有“接收者”角色非常重要,但并不是严格要求的,可以直接在ConcreteCommand中直接调用Receiver的相关操作。

4. Invoker(调用者类):负责将命令对象传递到合适的程序员
并执行此命令。

应用场景:
1.有时候需要向一个对象发送请求,但是并不知道请求的接受者
是谁,也不知道被请求的操作。

2.常见的undo操作,在遇到这种情况时,就可以将操作封装成一
个命令对象进行撤销操作。

3.按键操作,比如遥控器上的各个按钮,它们都有一个操作结果,播放电视、锁定频道等等。

优缺点:
1.可以将发起者与执行者解耦。

2.可以很容易地设计一个命令队列。

3.可以容易地实现对请求的撤销和重置;
4.可以方便地添加新的命令。

5.命令模式在一定程度上增加了系统的复杂性,需要有更多的类和对象;
6.在某些系统中可能需要实现宏命令或命令组,这些需要对命令模式进行修改。

命令模式的应用:
1.多级撤销控制
通常来说命令模式是支持撤销操作的。

但有时一条规则的撤销需要影响到一组之前的操作,此时可以考虑使用多级撤销控制。

命令模式提供的execute()和undo()操作是支持双向链表的,也就是说每个命令对象都有一个向前指针和一个向后指针,这样可以轻而易举地实现多级撤销控制。

2.通过命令队列来实现某些功能
有一类问题可以通过为每个正在处理的请求分配一个命令对象被轻松优雅的解决。

这类问题的根源在于客户端并不清楚那个对象将能够处理哪个请求,通常所做的只是将请求对象推送进命令队列中。

总结:
如果在开发中遇到有请求通知发起者无法明确响应的情况,可以考虑使用命令模式进行解决,比如请求通知语音提示后,用户的反应时间不确定,如何处理需要在时间确定后知道。

此时采用命令模式,让请求本身不直接响应,而是通过命令对象封装,并在用户有明确反应后才进行处理,这样就将请求与响应解耦,避免了用户和请求的嵌入式耦合。

相关文档
最新文档