首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

研磨设计方式之命令模式-4

2012-11-20 
研磨设计模式之命令模式-4?3.4? 宏命令??????? 什么是宏命令呢?简单点说就是包含多个命令的命令,是一个命

研磨设计模式之命令模式-4

?

3.4? 宏命令

??????? 什么是宏命令呢?简单点说就是包含多个命令的命令,是一个命令的组合。举个例子来说吧,设想一下你去饭店吃饭的过程:
??????? (1)你走进一家饭店,找到座位坐下
??????? (2)服务员走过来,递给你菜谱
??????? (3)你开始点菜,服务员开始记录菜单,菜单是三联的,点菜完毕,服务员就会把菜单分成三份,一份给后厨,一份给收银台,一份保留备查。
??????? (4)点完菜,你坐在座位上等候,后厨会按照菜单做菜
??????? (5)每做好一份菜,就会由服务员送到你桌子上
??????? (6)然后你就可以大快朵颐了
??????? 事实上,到饭店点餐是一个很典型的命令模式应用,作为客户的你,只需要发出命令,就是要吃什么菜,每道菜就相当于一个命令对象,服务员会在菜单上记录你点的菜,然后把菜单传递给后厨,后厨拿到菜单,会按照菜单进行饭菜制作,后厨就相当于接收者,是命令的真正执行者,厨师才知道每道菜具体怎么实现。
??????? 在这个过程中,地位比较特殊的是服务员,在不考虑更复杂的管理,比如后厨管理的时候,负责命令和接收者的组装的就是服务员。比如你点了凉菜、热菜,你其实是不知道到底凉菜由谁来完成,热菜由谁来完成的,因此你只管发命令,而组装的工作就由服务员完成了,服务员知道凉菜送到凉菜部,那是已经做好的了,热菜才送到后厨,需要厨师现做,看起来服务员是一个组装者。
??????? 同时呢,服务员还持有命令对象,也就是菜单,最后启动命令执行的也是服务员。因此,服务员就相当于标准命令模式中的Client和Invoker的融合。
??????? 画个图来描述上述对应关系,如图6所示:


研磨设计方式之命令模式-4
???????????????????????????????????????????????????图6? 点菜行为与命令模式对应示意图
1:宏命令在哪里?
??????? 仔细观察上面的过程,再想想前面的命令模式的实现,看出点什么没有?
??????? 前面实现的命令模式,都是客户端发出一个命令,然后马上就执行了这个命令,但是在上面的描述里面呢?是点一个菜,服务员就告诉厨师,然后厨师就开始做吗?很明显不是的,服务员会一直等,等到你点完菜,当你说“点完了”的时候,服务员才会启动命令的执行,请注意,这个时候执行的就不是一个命令了,而是执行一堆命令。
??????? 描述这一堆命令的就是菜单,如果把菜单也抽象成为一个命令,就相当于一个大的命令,当客户说“点完了”的时候,就相当于触发这个大的命令,意思就是执行菜单这个命令就可以了,这个菜单命令包含多个命令对象,一个命令对象就相当于一道菜。
??????? 那么这个菜单就相当于我们说的宏命令。
2:如何实现宏命令
??????? 宏命令从本质上讲类似于一个命令,基本上把它当命令对象进行处理。但是它跟普通的命令对象又有些不一样,就是宏命令包含有多个普通的命令对象,执行一个宏命令,简单点说,就是执行宏命令里面所包含的所有命令对象,有点打包执行的意味。
(1)先来定义接收者,就是厨师的接口和实现,先看接口,示例代码如下:

?

(2)接下来,来定义命令接口,跟以前一样,示例代码如下:

     2 楼    xcly    2010-07-16                每天早上在车上拜读您的大作,受益良多,楼主继续加油    3 楼    ngmr_8888    2010-07-16                  对楼主的佩服真是如滔滔江水,能把设计模式写得这么深入浅出、深度广度兼具,在我看过的资料里面,以绝对优势排第一,比市面上很多写模式的书都要好很多。    4 楼    rails2010    2010-07-19              高超的大师蹩脚专家的区别就在于
前者能把复杂的东西讲简单,后者恰恰相反

支持楼主! 5 楼 brandom520 2010-07-26   最近一直在看楼主的设计模式的文章,楼主写的真是太好了,受益匪浅啊! 6 楼 xueyi_lee 2011-08-03   rails2010 写道高超的大师蹩脚专家的区别就在于
前者能把复杂的东西讲简单,后者恰恰相反

支持楼主!

这位兄弟所言极是啊。。!

热点排行