1. [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <iterator>
  7.  
  8. using namespace std;
  9.  
  10. class Receiver
  11. {
  12. public:
  13. void BakeMutton()
  14. {
  15. cout<< "烤羊肉"<< endl;
  16. }
  17.  
  18. void BakeChicken()
  19. {
  20. cout<< "烤鸡翅"<< endl;
  21. }
  22. };
  23.  
  24. class Command
  25. {
  26. public:
  27. Command(Receiver* pstReceiver):m_pstReceiver(pstReceiver)
  28. {
  29.  
  30. }
  31. virtual void Excute() = ;
  32.  
  33. protected:
  34. Receiver* m_pstReceiver;
  35. };
  36.  
  37. class ConcreteCommandA: public Command
  38. {
  39. public:
  40. ConcreteCommandA(Receiver* pstReceiver):Command(pstReceiver)
  41. {
  42.  
  43. }
  44. virtual void Excute()
  45. {
  46. cout<< "ConcreteCommandA excuting......"<< endl;
  47. m_pstReceiver->BakeMutton();
  48. }
  49.  
  50. };
  51.  
  52. class ConcreteCommandB: public Command
  53. {
  54. public:
  55. ConcreteCommandB(Receiver* pstReceiver):Command(pstReceiver)
  56. {
  57.  
  58. }
  59. virtual void Excute()
  60. {
  61. cout<< "ConcreteCommandB excuting......"<< endl;
  62. m_pstReceiver->BakeChicken();
  63. }
  64. };
  65.  
  66. class Invoke
  67. {
  68. public:
  69. void Add(Command* pstCommand)
  70. {
  71. m_vecPstCommand.push_back(pstCommand);
  72. }
  73. void Remove(Command* pstCommand)
  74. {
  75. m_vecPstCommand.erase(find(m_vecPstCommand.begin(), m_vecPstCommand.end(), pstCommand));
  76. }
  77. void RemoveAll()
  78. {
  79. m_vecPstCommand.clear();
  80. }
  81. void Notify()
  82. {
  83. for (typeof(m_vecPstCommand.begin()) it = m_vecPstCommand.begin(); it != m_vecPstCommand.end(); ++it)
  84. {
  85. (*it)->Excute();
  86. }
  87. }
  88.  
  89. private:
  90. vector<Command*> m_vecPstCommand;
  91. };
  92.  
  93. int main(int argc, char* argv[])
  94. {
  95. Receiver* pstReceiver = new Receiver();
  96. Command* pstConcreteCommandA = new ConcreteCommandA(pstReceiver);
  97. Command* pstConcreteCommandB = new ConcreteCommandB(pstReceiver);
  98. Invoke* pstInvoke = new Invoke();
  99.  
  100. pstInvoke->Add(pstConcreteCommandA);
  101. pstInvoke->Add(pstConcreteCommandA);
  102. pstInvoke->Add(pstConcreteCommandB);
  103. pstInvoke->Notify();
  104. cout<< "------------------"<< endl<< endl;
  105.  
  106. pstInvoke->Remove(pstConcreteCommandA); //撤销操作
  107. pstInvoke->Remove(pstConcreteCommandB);
  108. pstInvoke->Notify();
  109. cout<< "------------------"<< endl<< endl;
  110.  
  111. return ;
  112. }
  113. ////////////////////////////////////////
  114. [root@ ~/learn_code/design_pattern/19_order]$ ./order
  115. ConcreteCommandA excuting......
  116. 烤羊肉
  117. ConcreteCommandA excuting......
  118. 烤羊肉
  119. ConcreteCommandB excuting......
  120. 烤鸡翅
  121. ------------------
  122.  
  123. ConcreteCommandA excuting......
  124. 烤羊肉
  125. ------------------

设计模式——命令模式(C++实现)的更多相关文章

  1. linkin大话设计模式--命令模式

    linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...

  2. 【设计模式】Java设计模式 - 命令模式

    Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...

  3. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. JAVA 设计模式 命令模式

    用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构

  5. 深入浅出设计模式——命令模式(Command Pattern)

    模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...

  6. Java设计模式-命令模式(Command)

    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...

  7. 设计模式--命令模式(Command)

    基本概念:  Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...

  8. javascript设计模式——命令模式

    前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...

  9. C++设计模式——命令模式

    什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...

  10. 浅谈js设计模式 — 命令模式

    命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...

随机推荐

  1. 2018年最完整5大网页设计图标解决方案:Font Awesome奥森图Unicode、CSS 和、Font以及国产zfont图标集

    网上有很多高质量的图标,基于icon的关键词能在Google上搜索到不少内容,不考虑版权外还要修改大小.颜色等等,现在介绍一些替代方案:Unicode.CSS 和 Font,它具有更高的灵活性. 方案 ...

  2. UVALive - 3644 X-Plosives (并查集)

    思路:每一个product都可以作一条边,每次添加一条边,如果这边的加入使得某个集合构成环,就应该refuse,那么就用并查集来判断. AC代码: //#define LOCAL #include & ...

  3. java网络编程(4)——udp实现聊天

    UDP可以实现在线聊天功能,我这里就是简单模拟一下: 发送端: package com.seven.udp; import java.io.BufferedReader; import java.io ...

  4. python+selenium+autoit实现文件上传

    问题 在做web端ui层自动化的时候会碰到文件上传的操作,经常有朋友问到,这里总结一下 解决方案 第一种:type=file的上传文件,类似如下的 使用类似这样的代码就可以完成: driver.fin ...

  5. win10安装mongodb及配置 和 mongodb的基本使用(node环境)

    mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...

  6. jmeter 脚本规范

    总结了一下公司正在用 jmeter 脚本规范. 使用 jmeter 进行接口级测试, 随着接口增多以及业务逻辑越来越复杂, 导致 jmeter 脚本的维护会更加困难.针对实际使用中发现的问题进行一些规 ...

  7. Hi3531 SDK 安装以及升级使用说明

    Hi3531 SDK 安装以及升级使用说明 第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明    如果您是首次安装本SDK,请直接参看第2章.     第二章 首次安装SDK 1.Hi ...

  8. 航空客户价值分析特色LRFMC模型——RFM升级

    本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...

  9. windows 7蓝屏解决办法

    1.通过工具打开出现蓝屏原因的dmp文件,找到原因 Unable to load image \SystemRoot\system32\ntkrnlpa.exe, Win32 error 0n2 2. ...

  10. Java生成文件夹

    Java生成文件夹 1.说明 判断文件夹是否存在,如果不存在就创建该文件夹,并打印其路径:如果存在,打印其路径 2.实现源码 /** * @Title:BuildFolder.java * @Pack ...