/****************************************************************************************************************
命令模式:说白了就是通过中间人专门去管理这个命令,将这个中间人称为管理命令类,由这个中间人完成指令的发送动作

适用于:
是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

实现方法:
创建命令:内部构造使用对象注入技术,完成对象调用的绑架  +  executecommand接口定义
不同的命令中完成命令的执行者函数(executecommand重写)+ executecommand(去调用具体执行者的函数) 
*****************************************************************************************************************/
#include<iostream>
#include<string>
#include<list>
using namespace std;
class barbecuer //执行指令的类
{
public:
void bakemutton()
{ cout << "烤羊肉串" << endl;}
void bakechickenwing()
{ cout << "烤鸡翅" << endl;}
};
class Command   //命令基类,既包含了命令基类的赋值,也定义了相关操作的接口
{
protected://命令类很关键的一步是,告诉大家谁去接受这个指令
barbecuer *receiver;//类的包含
public:
Command(barbecuer*receiver) //命令类很关键的一步是,告诉大家谁去接受这个指令
{ this->receiver = receiver;}
virtual void executecommand() = 0;
};
class bakermuttoncommand :public Command //命令传送者
{
public:
bakermuttoncommand(barbecuer*receiver) :Command(receiver)
{}
void executecommand()
{ receiver->bakemutton();}//执行烤羊肉串
};
class bakechikenwingcommand :public Command //命令传送者
{
public:
bakechikenwingcommand(barbecuer*receiver) :Command(receiver)
{}
void executecommand()
{receiver->bakechickenwing();}//执行烤鸡翅
};
class waiter //服务员单一,一次只能给一个对象下达指令
{
private:
Command *command;
public:
void setorder(Command*command) //对象注入技术,对象的赋值
{this->command = command;}
void notify()
{ command->executecommand();}
};//这个类对单一服务员的时候,可有可无。只是为了说明下面的超级服务员做铺垫
class waiter2  //超级服务员,通过list可以给多个对象下达命令进行操作
{
private:
list<Command*>orders;
public:
void setorder(Command*command)
{orders.push_back(command);}
void cancelorder(Command *command)
{}
void notify()
{
list<Command*>::iterator iter = orders.begin();
while (iter != orders.end())
{
(*iter)->executecommand();
iter++;
}
}
};
void main()
{
barbecuer *boy = new barbecuer;//创建一个执行动作的对象
Command *bm1 = new bakermuttoncommand(boy);//来一个命令创建一次,传送一次命令
//在bakermuttoncommand里面完成对executecommand的操作
//命令类,在基类中完成命令的执行者赋值(使用初始化列表)
bm1->executecommand();
Command *bm2 = new bakermuttoncommand(boy);
Command *bc1 = new bakechikenwingcommand(boy);

waiter2 *girl = new waiter2();//使用超级服务员,去管理这些个命令
girl->setorder(bm1);
girl->setorder(bm2);
girl->setorder(bc1);

girl->notify();
system("pause");

}

参考:传智播客--王保明

设计模式---命令模式(C++实现)相关推荐

  1. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  2. 设计模式 命令模式 实例_根据您的命令-命令设计模式

    设计模式 命令模式 实例 命令设计模式是一种广为人知的设计模式,属于行为设计模式("四人帮"的一部分). 顾名思义,它与应用程序中的动作和事件有关. 问题陈述: 假设有一个网页将在 ...

  3. C语言设计模式——命令模式

    C语言设计模式--命令模式 好处:让代码清晰明了,容易添加和删除,易维护. 哪些地方会用到命令模式?(列出几个常见的例子) 1.按键处理,每个按键按下得到一个索引(指的就是命令),一个按键对应一个处理 ...

  4. C语言实现设计模式—命令模式

    文章目录 C语言设计模式--命令模式 传统的实现方式如下:(伪代码) 命令模式优化 UML 用例说明 实现流程 command.h command.c main 总结 C语言设计模式--命令模式 好处 ...

  5. 游戏设计模式 - 命令模式在Unity中的应用(C#)

    游戏设计模式 - 命令模式在Unity中的应用(C#) 实测:这是一篇简单易懂的文章-> https://zhuanlan.zhihu.com/p/46937284

  6. C++设计模式——命令模式(command pattern)

    一.原理讲解 别名动作(action),事务(transaction). 1.1意图 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作 ...

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

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

  8. 小菜学设计模式——命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 背景 外面小摊与店面的比较,你就会发现,店面似乎更加容易管理,为什么呢?因为在客户与老板自己新增了很多员工,这些员工各司其职, ...

  9. 设计模式 命令模式 之 管理智能家电

    继续设计模式哈,今天带来命令模式,二话不说,先看定义: 定义:将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 这尼玛定义,看得 ...

  10. 设计模式- 命令模式

    Gof定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 理解 对命令模式我有一些肤浅的认识,也许是不对的.但我还是写一下.其实在 ...

最新文章

  1. 将多个csv文件导入到pandas中并串联到一个DataFrame中
  2. bootstrap中modal弹出框的使用
  3. 代替vscode的工具_Vscode官方版
  4. springboot entity date_SpringBoot+JWT实战(附源码)
  5. 使用T-SQL配置日志传送
  6. PMP 与IPMP区别是什么?
  7. JS学习笔记 - 面向对象 - 原型
  8. 高等代数(第三版)北大(参考答案)
  9. 技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流
  10. dubbo调用原理,过程(知其然,知其所以然)
  11. SpringBoot 发送邮件和附件
  12. 理科生的人生感悟-02-别忘了别人的痛苦 - 丰收之歌和围墙外的稻田
  13. 较好游戏型计算机配置单,i3-6100配什么显卡比较好?4000元i3-6100独显均衡游戏电脑配置推荐...
  14. 2020版无人机组装与维修(芯片级)
  15. 数字营销(三)如何确定合适的流量渠道?
  16. 支导线手工和电脑怎么计算方位角并推算坐标
  17. HR人力资源系统管理源码
  18. 记录一些之前学的APPUI设计知识
  19. 用文件的 sha1值判断文件是否重复(delphi语言)
  20. 《自动控制原理》PPT例题集合

热门文章

  1. Spark调优 数据倾斜
  2. Mongodb 3.2.X 添加admin的root账户
  3. inittab 分析
  4. net.sf.json.JSONException: #39;object#39; is an array. Use JSONArray instead
  5. HDU 4418 高斯消元解决概率期望
  6. 802.1D生成树STP协议
  7. avc水平什么意思_5个步骤切实有效地提高你的写作水平
  8. C++线程中的几类锁
  9. C++网络编程实例2(socket)
  10. 计算机网络(HCIP、HCIE)系列文章大合集