命令模式(Command)

定义

命令模式(Command),将一个请求封闭为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排除或记录请求日志,以及支持可撤销的操作。

类图

描述

Command:定义命令的统一接口;

ConcreteCommand:Command接口的实现者,要执行的具体命令;

Receiver:命令的实际执行者;

Invoker:命令的请求者,是命令模式中最重要的角色,用来对各个命令进行控制。

应用场景

顾客在餐馆用餐的时候,首先由顾客点餐,服务员记录顾客的点餐情况,然后服务员把订单传到后厨,厨师根据订单把顾客点的餐烹饪好。

  1. /// <summary>
  2. /// 厨师
  3. /// </summary>
  4. public class Chef
  5. {
  6. public void CookBeef()
  7. {
  8. Console.WriteLine("大厨开始爆炒牛肉.");
  9. Console.WriteLine("爆炒牛肉出锅.");
  10. }
  11.  
  12. public void CookFish()
  13. {
  14. Console.WriteLine("大厨开始水煮鱼.");
  15. Console.WriteLine("水煮鱼出锅.");
  16. }
  17.  
  18. public void CookEggplant()
  19. {
  20. Console.WriteLine("大厨开始红烧茄子.");
  21. Console.WriteLine("红烧茄子出锅.");
  22. }
  23. }
  24.  
  25. public abstract class Command
  26. {
  27. public string Name { get; set; }
  28. public abstract void Cook();
  29. }
  30.  
  31. /// <summary>
  32. /// 爆炒牛肉
  33. /// </summary>
  34. public class CookBeefCommand : Command
  35. {
  36. private Chef chef;
  37.  
  38. public CookBeefCommand(Chef chef)
  39. {
  40. this.chef = chef;
  41. base.Name = "爆炒牛肉";
  42. }
  43.  
  44. public override void Cook()
  45. {
  46. this.chef.CookBeef();
  47. }
  48. }
  49.  
  50. /// <summary>
  51. /// 红烧茄子
  52. /// </summary>
  53. public class CookEggplantCommand : Command
  54. {
  55. private Chef chef;
  56.  
  57. public CookEggplantCommand(Chef chef)
  58. {
  59. this.chef = chef;
  60. base.Name = "红烧茄子";
  61. }
  62.  
  63. public override void Cook()
  64. {
  65. this.chef.CookEggplant();
  66. }
  67. }
  68.  
  69. /// <summary>
  70. /// 水煮鱼
  71. /// </summary>
  72. public class CookFishCommand : Command
  73. {
  74. private Chef chef;
  75.  
  76. public CookFishCommand(Chef chef)
  77. {
  78. this.chef = chef;
  79. base.Name = "水煮鱼";
  80. }
  81.  
  82. public override void Cook()
  83. {
  84. this.chef.CookFish();
  85. }
  86. }
  87.  
  88. /// <summary>
  89. /// 服务员
  90. /// </summary>
  91. public class Waiter
  92. {
  93. private List<Command> commands;
  94.  
  95. public Waiter()
  96. {
  97. this.commands = new List<Command>();
  98. }
  99.  
  100. public void SetOrder(Command command)
  101. {
  102. this.commands.Add(command);
  103. Console.WriteLine("增加订单:" + command.Name);
  104. }
  105.  
  106. public void CancelOrder(Command command)
  107. {
  108. this.commands.Remove(command);
  109. Console.WriteLine("取消订单:" + command.Name);
  110. }
  111.  
  112. public void Notify()
  113. {
  114. foreach (Command command in this.commands)
  115. {
  116. command.Cook();
  117. }
  118. }
  119. }

设计模式之笔记--命令模式(Command)的更多相关文章

  1. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

  2. Java-马士兵设计模式学习笔记-命令模式

    一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...

  3. 学习笔记——命令模式Command

    命令模式,将具体操作Receiver封在Command中,调用类只需要知道Command即可.

  4. 《JAVA设计模式》之命令模式(Command)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...

  5. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

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

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  7. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  8. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

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

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

随机推荐

  1. P1107 [BJWC2008]雷涛的小猫

    题目描述 雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的).在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了. 可是有一天,雷涛下课回 ...

  2. CF44H Phone Number

    题意翻译 给你一个电话号码,根据这个号码生成一个新的号码.生成的规则就是 新号码的第一个数任意选(0-9), 然后之后的每一个新号码都按照以下规则生成: 第i个新号码=(第i-1个新号码+第i个老号码 ...

  3. 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek

    题目戳 题目描述 Bessie is playing hide and seek (a game in which a number of players hide and a single play ...

  4. [您有新的未分配科技点]博弈论进阶:似乎不那么恐惧了…… (SJ定理,简单的基础模型)

    这次,我们来继续学习博弈论的知识.今天我们会学习更多的基础模型,以及SJ定理的应用. 首先,我们来看博弈论在DAG上的应用.首先来看一个小例子:在一个有向无环图中,有一个棋子从某一个点开始一直向它的出 ...

  5. castle activerecord 学习过程出现的问题

    优点: 1.CRUD:代码简洁 2.不用配置map 3.自带事务方便 4.自带IOC 5.自带 数据有效性验证 缺点: 1.自增长(Oracle 一直提示序号不存在,有空继续尝试) 2.多条件,直接用 ...

  6. 【BZOJ1458】【洛谷4311】士兵占领(网络流)

    [BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...

  7. HDU1863畅通工程---并查集+最小生成树

    #include<cstdio> #include<algorithm> #define MAX 105 struct edge { int from,to; long lon ...

  8. 电子商务(电销)平台中用户模块(User)数据库设计明细

    以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 用户基础表(user_base)|-- 自动编号 (user_id)|-- 用户名 (us ...

  9. Codeforces 932.F Escape Through Leaf

    F. Escape Through Leaf time limit per test 3 seconds memory limit per test 256 megabytes input stand ...

  10. kvm虚拟机配置被克隆rhel6客户机的网卡

    例子:配置被克隆rhel6客户机的网卡 rhel6的网卡是通过udev规则来进行命名每个网卡都有不一样的macudev规则是根据网卡的mac来进行识别克隆出来的客户机,为了遵守每个网卡的mac都是全球 ...