- 浏览: 467275 次
- 性别:
- 来自: 北京
-
最新评论
-
lm818:
最近一直在看设计模式,发现写的那本研磨真的不错,容易理解,能看 ...
大讨论:学习和应用设计模式的经验、教训、疑问等 -
yjfnwxf:
看了楼主博文,真为自己汗颜呀。。。。努力,再努力
研磨设计模式之命令模式-5 -
fengdandanweikang:
...
研磨设计模式 之 观察者模式(Observer) 1——跟着cc学设计系列 -
tiansong163:
你好,对《研磨设计模式》中UML有一个图标不知道是什么意思?希 ...
跟着cc学设计 之 研磨设计模式 目录汇总贴 -
soualliron:
国人就会溜须拍马,文章冠题“大讨论”,下面全是附会之音,无切实 ...
大讨论:学习和应用设计模式的经验、教训、疑问等
3.4 宏命令
什么是宏命令呢?简单点说就是包含多个命令的命令,是一个命令的组合。举个例子来说吧,设想一下你去饭店吃饭的过程:
(1)你走进一家饭店,找到座位坐下
(2)服务员走过来,递给你菜谱
(3)你开始点菜,服务员开始记录菜单,菜单是三联的,点菜完毕,服务员就会把菜单分成三份,一份给后厨,一份给收银台,一份保留备查。
(4)点完菜,你坐在座位上等候,后厨会按照菜单做菜
(5)每做好一份菜,就会由服务员送到你桌子上
(6)然后你就可以大快朵颐了
事实上,到饭店点餐是一个很典型的命令模式应用,作为客户的你,只需要发出命令,就是要吃什么菜,每道菜就相当于一个命令对象,服务员会在菜单上记录你点的菜,然后把菜单传递给后厨,后厨拿到菜单,会按照菜单进行饭菜制作,后厨就相当于接收者,是命令的真正执行者,厨师才知道每道菜具体怎么实现。
在这个过程中,地位比较特殊的是服务员,在不考虑更复杂的管理,比如后厨管理的时候,负责命令和接收者的组装的就是服务员。比如你点了凉菜、热菜,你其实是不知道到底凉菜由谁来完成,热菜由谁来完成的,因此你只管发命令,而组装的工作就由服务员完成了,服务员知道凉菜送到凉菜部,那是已经做好的了,热菜才送到后厨,需要厨师现做,看起来服务员是一个组装者。
同时呢,服务员还持有命令对象,也就是菜单,最后启动命令执行的也是服务员。因此,服务员就相当于标准命令模式中的Client和Invoker的融合。
画个图来描述上述对应关系,如图6所示:
图6 点菜行为与命令模式对应示意图
1:宏命令在哪里?
仔细观察上面的过程,再想想前面的命令模式的实现,看出点什么没有?
前面实现的命令模式,都是客户端发出一个命令,然后马上就执行了这个命令,但是在上面的描述里面呢?是点一个菜,服务员就告诉厨师,然后厨师就开始做吗?很明显不是的,服务员会一直等,等到你点完菜,当你说“点完了”的时候,服务员才会启动命令的执行,请注意,这个时候执行的就不是一个命令了,而是执行一堆命令。
描述这一堆命令的就是菜单,如果把菜单也抽象成为一个命令,就相当于一个大的命令,当客户说“点完了”的时候,就相当于触发这个大的命令,意思就是执行菜单这个命令就可以了,这个菜单命令包含多个命令对象,一个命令对象就相当于一道菜。
那么这个菜单就相当于我们说的宏命令。
2:如何实现宏命令
宏命令从本质上讲类似于一个命令,基本上把它当命令对象进行处理。但是它跟普通的命令对象又有些不一样,就是宏命令包含有多个普通的命令对象,执行一个宏命令,简单点说,就是执行宏命令里面所包含的所有命令对象,有点打包执行的意味。
(1)先来定义接收者,就是厨师的接口和实现,先看接口,示例代码如下:
/** * 厨师的接口 */ public interface CookApi { /** * 示意,做菜的方法 * @param name 菜名 */ public void cook(String name); }
厨师又分成两类,一类是做热菜的师傅,一类是做凉菜的师傅,先看看做热菜的厨师的实现示意,示例代码如下:
/** * 厨师对象,做热菜 */ public class HotCook implements CookApi{ public void cook(String name) { System.out.println("本厨师正在做:"+name); } }
做凉菜的师傅,示例代码如下:
/** * 厨师对象,做凉菜 */ public class CoolCook implements CookApi { public void cook(String name) { System.out.println("凉菜"+name+"已经做好,本厨师正在装盘。" ); } }
(2)接下来,来定义命令接口,跟以前一样,示例代码如下:
/** * 命令接口,声明执行的操作 */ public interface Command { /** * 执行命令对应的操作 */ public void execute(); }
(3)定义好了命令的接口,该来具体实现命令了。
实现方式跟以前一样,持有接收者,当执行命令的时候,转调接收者,让接收者去真正实现功能,这里的接收者就是厨师。
这里实现命令的时候,跟标准的命令模式的命令实现有一点不同,标准的命令模式的命令实现的时候,是通过构造方法传入接收者对象,这里改成了使用setter的方式来设置接收者对象,也就是说可以动态的切换接收者对象,而无须重新构建对象。
示例中定义了三道菜,分别是两道热菜:北京烤鸭、绿豆排骨煲,一道凉菜:蒜泥白肉,三个具体的实现类非常类似,只是菜名不同,为了节省篇幅,这里就只看一个命令对象的具体实现。代码示例如下:
/** * 命令对象,绿豆排骨煲 */ public class ChopCommand implements Command{ /** * 持有具体做菜的厨师的对象 */ private CookApi cookApi = null; /** * 设置具体做菜的厨师的对象 * @param cookApi 具体做菜的厨师的对象 */ public void setCookApi(CookApi cookApi) { this.cookApi = cookApi; } public void execute() { this.cookApi.cook("绿豆排骨煲"); } }
(4)该来组合菜单对象了,也就是宏命令对象。
- 首先宏命令就其本质还是一个命令,所以一样要实现Command接口
- 其次宏命令跟普通命令的不同在于:宏命令是多个命令组合起来的,因此在宏命令对象里面会记录多个组成它的命令对象
- 第三,既然是包含多个命令对象,得有方法让这多个命令对象能被组合进来
- 第四,既然宏命令包含了多个命令对象,执行宏命令对象就相当于依次执行这些命令对象,也就是循环执行这些命令对象
看看代码示例会更清晰些,代码示例如下:
/** * 菜单对象,是个宏命令对象 */ public class MenuCommand implements Command { /** * 用来记录组合本菜单的多道菜品,也就是多个命令对象 */ private Collection<Command> col = new ArrayList<Command>(); /** * 点菜,把菜品加入到菜单中 * @param cmd 客户点的菜 */ public void addCommand(Command cmd){ col.add(cmd); } public void execute() { //执行菜单其实就是循环执行菜单里面的每个菜 for(Command cmd : col){ cmd.execute(); } } }
(5)该服务员类重磅登场了,它实现的功能,相当于标准命令模式实现中的Client加上Invoker,前面都是文字讲述,看看代码如何实现,示例代码如下:
/** * 服务员,负责组合菜单,负责组装每个菜和具体的实现者, * 还负责执行调用,相当于标准Command模式的Client+Invoker */ public class Waiter { /** * 持有一个宏命令对象——菜单 */ private MenuCommand menuCommand = new MenuCommand(); /** * 客户点菜 * @param cmd 客户点的菜,每道菜是一个命令对象 */ public void orderDish(Command cmd){ //客户传过来的命令对象是没有和接收者组装的 //在这里组装吧 CookApi hotCook = new HotCook(); CookApi coolCook = new CoolCook(); //判读到底是组合凉菜师傅还是热菜师傅 //简单点根据命令的原始对象的类型来判断 if(cmd instanceof DuckCommand){ ((DuckCommand)cmd).setCookApi(hotCook); }else if(cmd instanceof ChopCommand){ ((ChopCommand)cmd).setCookApi(hotCook); }else if(cmd instanceof PorkCommand){ //这是个凉菜,所以要组合凉菜的师傅 ((PorkCommand)cmd).setCookApi(coolCook); } //添加到菜单中 menuCommand.addCommand(cmd); } /** * 客户点菜完毕,表示要执行命令了,这里就是执行菜单这个组合命令 */ public void orderOver(){ this.menuCommand.execute(); } }
(6)费了这么大力气,终于可以坐下来歇息一下,点菜吃饭吧,一起来看看客户端怎么使用这个宏命令,其实在客户端非常简单,根本看不出宏命令来,代码示例如下:
public class Client { public static void main(String[] args) { //客户只是负责向服务员点菜就好了 //创建服务员 Waiter waiter = new Waiter(); //创建命令对象,就是要点的菜 Command chop = new ChopCommand(); Command duck = new DuckCommand(); Command pork = new PorkCommand(); //点菜,就是把这些菜让服务员记录下来 waiter.orderDish(chop); waiter.orderDish(duck); waiter.orderDish(pork); //点菜完毕 waiter.orderOver(); } }
运行一下,享受一下成果,结果如下:
本厨师正在做:绿豆排骨煲 本厨师正在做:北京烤鸭 凉菜蒜泥白肉已经做好,本厨师正在装盘。
未完待续......
评论
前者能把复杂的东西讲简单,后者恰恰相反
支持楼主!
这位兄弟所言极是啊。。!
前者能把复杂的东西讲简单,后者恰恰相反
支持楼主!

发表评论
-
私塾在线推出《一案贯通GoF设计模式》项目实战
2012-10-19 22:12 20《研磨设计模式》出版以来,包括iteye上的朋友,很多人 ... -
研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列
2012-08-22 08:50 423915.3 模式讲解 15.3.1 认识组合模式 ... -
研磨设计模式 之 组合模式(Composite) 2——跟着cc学设计系列
2012-08-20 13:53 340415.2 解决方案 15.2.1 组合模式来解决 ... -
研磨设计模式 之 组合模式(Composite) 1——跟着cc学设计系列
2012-08-20 12:17 309015.1 场景问题 15.1.1 商品类别树 ... -
研磨设计模式 之 迭代器模式(Iterator)3——跟着cc学设计系列
2012-08-19 07:07 384814.3 模式讲解 14.3.1 ... -
研磨设计模式 之 迭代器模式(Iterator)2——跟着cc学设计系列
2012-08-18 03:48 265714.2 解决方案 14.2.1 ... -
研磨设计模式 之 迭代器模式(Iterator)2——跟着cc学设计系列
2012-08-17 18:26 10614.2 解决方案 14.2.1 ... -
研磨设计模式 之 迭代器模式(Iterator)1——跟着cc学设计系列
2012-08-17 10:38 205014.1 场景问题 14.1.1 ... -
私塾在线《研磨设计模式》,精品课程上线特大惊喜
2012-08-17 10:03 6072《研磨设计模式》——跟着CC学设计,视频课程在 私塾在线 ... -
研磨设计模式 之 观察者模式(Observer) 3——跟着cc学设计系列
2012-08-16 08:51 302312.3 模式讲解 12.3.1 认识观察者模式 ... -
研磨设计模式 之 观察者模式(Observer) 2——跟着cc学设计系列
2012-08-15 07:03 287912.2 解决方案 12.2 ... -
研磨设计模式 之 观察者模式(Observer) 1——跟着cc学设计系列
2012-08-15 07:03 212812.1 场景问题 12.1.1 订阅报纸的过程 ... -
跟着cc学设计系列 之 研磨设计模式 目录汇总贴
2012-08-14 14:49 36研磨设计模式 的 前言 ——跟着cc学 ... -
研磨设计模式 之 代理模式(Proxy)3——跟着cc学设计系列
2012-08-14 14:36 235611.3 模式讲解 11.3.1 认识代理模式 ... -
研磨设计模式 之 代理模式(Proxy)2——跟着cc学设计系列
2012-08-13 12:36 290611.2 解决方案 11.2.1 代理模式来解 ... -
研磨设计模式 之 代理模式(Proxy)1——跟着cc学设计系列
2012-08-13 12:35 219211.1 场景问题 11.1.1 访问多条数据 ... -
研磨设计模式 之 中介者模式(Mediator)3 ——跟着cc学设计系列
2012-08-11 11:50 123510.3 模式讲解 10.3.1 认识中介者模式 ... -
研磨设计模式 之 中介者模式(Mediator)2 ——跟着cc学设计系列
2012-08-09 08:23 147210.2 解决方案 10.2.1 中介者模式来 ... -
研磨设计模式 之 中介者模式(Mediator)1 ——跟着cc学设计系列
2012-08-09 08:23 148810.1 场景问题 10.1.1 ... -
研磨设计模式 之 原型模式(Prototype)3 ——跟着cc学设计系列
2012-08-08 08:14 15879.3 模式讲解 9.3.1 ...
相关推荐
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...
研磨设计模式的过程是持续学习和实践的过程,chjavach的博客文章提供了深入探讨这些模式的宝贵资源,值得我们仔细阅读和学习。通过深入理解和运用这些设计模式,可以提升个人的编程技巧,同时也为团队合作和项目维护...
《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...
《研磨设计模式》这本书是软件开发领域中的经典之作,主要关注的是面向对象设计中的设计模式。设计模式是在特定上下文中解决常见问题的最佳实践,它为开发者提供了在类似情况下重复使用解决方案的模板,有助于提高...
这个“研磨设计模式博文集”显然是一份深入探讨设计模式的资料集合,其中可能包含了对多种设计模式的详细解析、示例代码以及实际应用中的经验分享。在软件开发中,设计模式能够帮助开发者提高代码质量、可读性和可...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
"研磨设计模式 演示源代码"这个资源包含了对设计模式的详细解释和实例分析,旨在帮助学习者深入理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在资源管理、缓存或者线程池...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
这个名为“研磨设计模式视频课程PPT”的压缩包包含了一份关于23种核心设计模式的详细教学资料,旨在帮助开发者提升软件设计的效率和可维护性。下面将对这些设计模式进行深入解析。 1. **单例模式(Singleton)**:...
这篇“设计模式学习心得(研磨设计模式)”博客及其相关的PDF文档,为我们提供了一个深入理解和应用设计模式的宝贵资源。以下将针对单例模式、工厂方法模式、策略模式、命令模式和桥接模式进行详细讲解。 1. **单例...
《研磨设计模式》实战是IT领域中关于软件设计的一份重要资料,它主要探讨了设计模式在实际项目中的应用。设计模式是软件工程中经过长期实践总结出的通用问题解决方案,是解决常见设计问题的经验总结。这份PPT可能是...
Java的研磨设计模式是将这些模式应用到Java编程中的具体体现,它能够帮助开发者编写出更加灵活、可维护和可扩展的代码。本篇文章将深入探讨设计模式的核心概念,并通过Java实例来解析这些模式。 1. 单例模式:确保...
设计模式Golang实现《研磨设计模式》读书笔记Go语言设计模式Go语言设计模式的实例代码创建模式工厂简单模式(Simple Factory)工厂方法模式(工厂方法)抽象工厂模式(Abstract Factory)创建者模式(Builder)原型...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...