设计模式-行为型-命令模式(COMMAND)

  命令模式是一个结构比较简单的设计模式,gof在书中对它的定义是:“将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。”

  这里有两个要点,第一请求被封装成了一个对象,第二请求可以被持久化(排队或是记录、取消)。

  我们从第一个要点说起。首先需要注意一点的所有COMMAND的模型都可以抽象出一个Execute概念或是类似概念。如下图(左)一样,这里的请求就是对文档做出paste操作,封装的结果就是通过PasteCommand的一个对象就能完成对一个特定document的操作,这个特定的document可能在构建这个PasteCommand对象时创建的,或者是在以后的使用中通过PasteCommand对象的成员变量设置的,不一而足,这全取决于你的实现。这样原本应该是一个函数做的事情变成了一个对象。乍一看仿佛这样的操作是多此一举,但是我们回忆一下工厂模式里面提到的关于提出“工厂”这个抽象的好处,其中一个就是给程序带来了一个子类挂钩,这样可以将所有关于该请求的可能变化推迟到了command子类对象,一方面大大提高了程序的可读性也满足的开闭设计原则。下图(右)的例子就很好的说明了把请求封装成对象带给我们的直接好处。

                        

  接下来我们看看,请求可以被持久化。第一点我们看到由于新增了一个子类挂钩,给整个设计增加了很大的拓展性,所有的业务逻辑都可以封装到子类。同时因为新增了子类层次,子类对象也可以管理自己的状态,这种状态可以体现在调用对象,既是请求的记录上。因为有了子类层次,让这类信息的获取就直接转换成了通过子类对象的成员函数获取子类对象的状态这样的问题。

  回顾一下上一个责任链模式的结构图。细心的读者会发现下图的蓝框里面的结构很像的命令模式,所有ConcreteHandler都可以被看作是一个COMMAND,所有的COMMAND共享一个概念HandleRequest,这个概念类似于Command的Execute。gof的书中提到了COMMAND于COMPOSITE的密切联系,CHAIN OF RESPONSIBILITY于COMPOSITE的密切联系。单单漏掉了CHAIN OF RESPONSIBILITY与COMMAND的联系,为什么呢? 就笔者的理解,CHAIN OF RESPONSIBILITY跟COMMAND,他们直接的关系就像是BUILDER与FACTORY METHOD一样,只有有形式上的联系。我们可以注意到两个设计模式的定义,CHAIN OF RESPONSIBILITY强调了同样的请求被传递到不动的处理节点,但是COMMAND模式则是转换请求为一个对象,一个是请求传递,一个是请求转换。所有根本上两个模式的设计目的是不同的。那么这个设计模式在现实当中有用处吗?笔者注意到C++11标准或是boost库中的thread类,将对执行流的要求转换成了对thread对象的调用,只是thread类没有实现请求持续化的要求,thread类有的是保存了执行流的状态。但是不妨碍它把请求转换成对象的事实,所有笔者认为thread类就是一个弱化的command模式。

时间: 2024-11-08 18:12:16

设计模式-行为型-命令模式(COMMAND)的相关文章

[设计模式-行为型]命令模式(Command)

一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我.这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:"我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面."命令模式:命令模式把一个请求或者操作封装到一个对象中.命令模式把发出命令的责任和执行命令的责任

设计模式-行为型-命令模式

命令模式(Command): 将请求封装成对象,以便使用不同的请求.日志.队列等来参数化其他对象.命令模式也支持撤销操作. 命令模式的角色: 1)传递命令对象(Invoker):是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者. 2)抽象命令接口(Command):声明执行命令的接口,拥有执行命令的抽象方法execute(). 3)具体的命令对象(ConcreteCommand):是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式能够用于运行撤销(undo)操作. 详细方法: 1. 对象类中须要保存状态, 如level. package command; public class CeilingFan { String lo