研磨设计模式之命令模式-4(转)

研磨设计模式之命令模式-4(转)3 4 宏命令什么是宏命令呢 简单点说就是包含多个命令的命令 是一个命令的组合

大家好,欢迎来到IT知识分享网。

3.4  宏命令

Java代码 

  1. / 
  2.  * 厨师的接口 
  3.  */  
  4. public interface CookApi {  
  5.     / 
  6.      * 示意,做菜的方法 
  7.      * @param name 菜名 
  8.      */  
  9.     public void cook(String name);  
  10. }  

 

厨师又分成两类,一类是做热菜的师傅,一类是做凉菜的师傅,先看看做热菜的厨师的实现示意,示例代码如下:

Java代码 

  1. / 
  2.  * 厨师对象,做热菜 
  3.  */  
  4. public class HotCook implements CookApi{  
  5.     public void cook(String name) {  
  6.         System.out.println(“本厨师正在做:”+name);  
  7.     }  
  8. }  

 

做凉菜的师傅,示例代码如下:

Java代码 

  1. / 
  2.  * 厨师对象,做凉菜 
  3.  */  
  4. public class CoolCook implements CookApi {  
  5.     public void cook(String name) {  
  6.         System.out.println(“凉菜”+name+“已经做好,本厨师正在装盘。” );  
  7.     }  
  8. }  

 

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

Java代码 

  1. / 
  2.  * 命令接口,声明执行的操作 
  3.  */  
  4. public interface Command {  
  5.     / 
  6.      * 执行命令对应的操作 
  7.      */  
  8.     public void execute();  
  9. }  

 

Java代码 

  1. / 
  2.  * 命令对象,绿豆排骨煲 
  3.  */  
  4. public class ChopCommand implements Command{  
  5.     / 
  6.      * 持有具体做菜的厨师的对象 
  7.      */  
  8.     private CookApi cookApi = null;  
  9.     / 
  10.      * 设置具体做菜的厨师的对象 
  11.      * @param cookApi 具体做菜的厨师的对象 
  12.      */  
  13.     public void setCookApi(CookApi cookApi) {  
  14.         this.cookApi = cookApi;  
  15.     }  
  16.   
  17.     public void execute() {  
  18.         this.cookApi.cook(“绿豆排骨煲”);  
  19.     }  
  20. }  

 

(4)该来组合菜单对象了,也就是宏命令对象。

  • 首先宏命令就其本质还是一个命令,所以一样要实现Command接口
  • 其次宏命令跟普通命令的不同在于:宏命令是多个命令组合起来的,因此在宏命令对象里面会记录多个组成它的命令对象
  • 第三,既然是包含多个命令对象,得有方法让这多个命令对象能被组合进来
  • 第四,既然宏命令包含了多个命令对象,执行宏命令对象就相当于依次执行这些命令对象,也就是循环执行这些命令对象

     看看代码示例会更清晰些,代码示例如下:

Java代码 

  1. / 
  2.  * 菜单对象,是个宏命令对象 
  3.  */  
  4. public class MenuCommand implements Command {  
  5.     / 
  6.      * 用来记录组合本菜单的多道菜品,也就是多个命令对象 
  7.      */  
  8.     private Collection<Command> col = new ArrayList<Command>();  
  9.     / 
  10.      * 点菜,把菜品加入到菜单中 
  11.      * @param cmd 客户点的菜 
  12.      */  
  13.     public void addCommand(Command cmd){  
  14.         col.add(cmd);  
  15.     }  
  16.     public void execute() {  
  17.         //执行菜单其实就是循环执行菜单里面的每个菜  
  18.         for(Command cmd : col){  
  19.             cmd.execute();  
  20.         }  
  21.     }  
  22. }  

 (5)该服务员类重磅登场了,它实现的功能,相当于标准命令模式实现中的Client加上Invoker,前面都是文字讲述,看看代码如何实现,示例代码如下:

Java代码 

  1. / 
  2.  * 服务员,负责组合菜单,负责组装每个菜和具体的实现者, 
  3.  * 还负责执行调用,相当于标准Command模式的Client+Invoker 
  4.  */  
  5. public class Waiter {  
  6.     / 
  7.      * 持有一个宏命令对象——菜单 
  8.      */  
  9.     private MenuCommand menuCommand = new MenuCommand();  
  10.     / 
  11.      * 客户点菜 
  12.      * @param cmd 客户点的菜,每道菜是一个命令对象 
  13.      */  
  14.     public void orderDish(Command cmd){  
  15.         //客户传过来的命令对象是没有和接收者组装的  
  16.         //在这里组装吧  
  17.         CookApi hotCook = new HotCook();  
  18.         CookApi coolCook = new CoolCook();  
  19.         //判读到底是组合凉菜师傅还是热菜师傅  
  20.         //简单点根据命令的原始对象的类型来判断  
  21.         if(cmd instanceof DuckCommand){  
  22.             ((DuckCommand)cmd).setCookApi(hotCook);  
  23.         }else if(cmd instanceof ChopCommand){  
  24.             ((ChopCommand)cmd).setCookApi(hotCook);  
  25.         }else if(cmd instanceof PorkCommand){  
  26.             //这是个凉菜,所以要组合凉菜的师傅  
  27.             ((PorkCommand)cmd).setCookApi(coolCook);  
  28.         }  
  29.         //添加到菜单中  
  30.         menuCommand.addCommand(cmd);  
  31.     }  
  32.     / 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116615.html

(0)
上一篇 2025-11-27 17:20
下一篇 2025-11-27 17:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信