命令设计模式:将一个操作封装到对象中,然后创建多个这种带有不同操作的对象(它们都执行了一个相同接口)并将它们封装到一个类中,然后该类根据不同的入参调用不同的对象执行其对应的操作。
命令设计模式与策略模式的区别
-- 相同点:
-- 毫无疑问,第一个相同点肯定是:封装变化。策略模式封装算法的变法,命令模式封装请求的变化。
-- 都使用组合来实现功能,达到解耦的目的。
-- 如果我们将命令模式做更高层次上的抽象,可以将它看成是一种策略模式。如:我们将Client与
Invoker封装到一起,将Concrete Command与Receiver封装到一起。
-- 策略(Strategy)模式:
-- 策略模式实际上比较简单。Head First Design Pattern介绍的第一个模式就是策略模式。
-- GoF定义:定义一组算法,把他们封装起来,并且是他们可以相互替换。该模式使算法可以独立于使
用它的客户而变化。
-- 实现:其实一句话就可以说明该模式的精髓:面向抽象编程。用户维护一个该系列算法的统一接口,
可以互相替换的算法实现该接口。从而将客户与具体的算法实现解耦。
-- 命令(Command)模式:
-- 命令模式要比策略模式复杂一些。这可以从命令模式结构图(在专门介绍命令模式的博文中有)中
所涉及的角色数量可做出不印证。
-- 命令模式涉及的角色有:Client, Command Interface, Concrete Command, Invoker以及真正处理请
求的Receiver;而策略模式只需要:Client, Strategy Interface以及Concrete Strategy.
-- GoF定义:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或
记录请求日志,以及支持可撤销的操作。
-- 实现:Client创建一个Command,并为Command绑定一个Receiver。将该Command传给一个Invoker,当
Invoker被唤醒时,调用Command的Execute方法,而Execute方法则最终调用Receiver的相关方法完成
请求。当然Client中可以维护一个Command队列,Command中也可以实现一个undo操作。从而实现对操
作的撤销与重做。
-- 结论:命令模式可以被抽象地视为一种策略模式。但是显然命令模式处理的是更为复杂的情况。或许我们
可以这么讲:策略模式聚焦的是对相同请求更换解决方案的灵活性;而命令模式聚焦的是对多请求变化的
封装以及对相同请求不同的请求形式解决方法的可复用性(例如GOFDP中提出的文本编辑器来自不同按钮/菜
单项的请求实现相同的功能)。
参见:
http://blog.csdn.net/wsh622827/article/details/4759368
http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html
http://blog.sina.com.cn/s/blog_67fdef900101g0z3.html