设计模式——命令模式(C++实现)
- [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <iterator>
- using namespace std;
- class Receiver
- {
- public:
- void BakeMutton()
- {
- cout<< "烤羊肉"<< endl;
- }
- void BakeChicken()
- {
- cout<< "烤鸡翅"<< endl;
- }
- };
- class Command
- {
- public:
- Command(Receiver* pstReceiver):m_pstReceiver(pstReceiver)
- {
- }
- virtual void Excute() = ;
- protected:
- Receiver* m_pstReceiver;
- };
- class ConcreteCommandA: public Command
- {
- public:
- ConcreteCommandA(Receiver* pstReceiver):Command(pstReceiver)
- {
- }
- virtual void Excute()
- {
- cout<< "ConcreteCommandA excuting......"<< endl;
- m_pstReceiver->BakeMutton();
- }
- };
- class ConcreteCommandB: public Command
- {
- public:
- ConcreteCommandB(Receiver* pstReceiver):Command(pstReceiver)
- {
- }
- virtual void Excute()
- {
- cout<< "ConcreteCommandB excuting......"<< endl;
- m_pstReceiver->BakeChicken();
- }
- };
- class Invoke
- {
- public:
- void Add(Command* pstCommand)
- {
- m_vecPstCommand.push_back(pstCommand);
- }
- void Remove(Command* pstCommand)
- {
- m_vecPstCommand.erase(find(m_vecPstCommand.begin(), m_vecPstCommand.end(), pstCommand));
- }
- void RemoveAll()
- {
- m_vecPstCommand.clear();
- }
- void Notify()
- {
- for (typeof(m_vecPstCommand.begin()) it = m_vecPstCommand.begin(); it != m_vecPstCommand.end(); ++it)
- {
- (*it)->Excute();
- }
- }
- private:
- vector<Command*> m_vecPstCommand;
- };
- int main(int argc, char* argv[])
- {
- Receiver* pstReceiver = new Receiver();
- Command* pstConcreteCommandA = new ConcreteCommandA(pstReceiver);
- Command* pstConcreteCommandB = new ConcreteCommandB(pstReceiver);
- Invoke* pstInvoke = new Invoke();
- pstInvoke->Add(pstConcreteCommandA);
- pstInvoke->Add(pstConcreteCommandA);
- pstInvoke->Add(pstConcreteCommandB);
- pstInvoke->Notify();
- cout<< "------------------"<< endl<< endl;
- pstInvoke->Remove(pstConcreteCommandA); //撤销操作
- pstInvoke->Remove(pstConcreteCommandB);
- pstInvoke->Notify();
- cout<< "------------------"<< endl<< endl;
- return ;
- }
- ////////////////////////////////////////
- [root@ ~/learn_code/design_pattern/19_order]$ ./order
- ConcreteCommandA excuting......
- 烤羊肉
- ConcreteCommandA excuting......
- 烤羊肉
- ConcreteCommandB excuting......
- 烤鸡翅
- ------------------
- ConcreteCommandA excuting......
- 烤羊肉
- ------------------
设计模式——命令模式(C++实现)的更多相关文章
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
- 【设计模式】Java设计模式 - 命令模式
Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 命令模式
用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构
- 深入浅出设计模式——命令模式(Command Pattern)
模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...
- Java设计模式-命令模式(Command)
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...
- 设计模式--命令模式(Command)
基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...
- javascript设计模式——命令模式
前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...
- C++设计模式——命令模式
什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...
- 浅谈js设计模式 — 命令模式
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...
随机推荐
- 2018年最完整5大网页设计图标解决方案:Font Awesome奥森图Unicode、CSS 和、Font以及国产zfont图标集
网上有很多高质量的图标,基于icon的关键词能在Google上搜索到不少内容,不考虑版权外还要修改大小.颜色等等,现在介绍一些替代方案:Unicode.CSS 和 Font,它具有更高的灵活性. 方案 ...
- UVALive - 3644 X-Plosives (并查集)
思路:每一个product都可以作一条边,每次添加一条边,如果这边的加入使得某个集合构成环,就应该refuse,那么就用并查集来判断. AC代码: //#define LOCAL #include & ...
- java网络编程(4)——udp实现聊天
UDP可以实现在线聊天功能,我这里就是简单模拟一下: 发送端: package com.seven.udp; import java.io.BufferedReader; import java.io ...
- python+selenium+autoit实现文件上传
问题 在做web端ui层自动化的时候会碰到文件上传的操作,经常有朋友问到,这里总结一下 解决方案 第一种:type=file的上传文件,类似如下的 使用类似这样的代码就可以完成: driver.fin ...
- win10安装mongodb及配置 和 mongodb的基本使用(node环境)
mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...
- jmeter 脚本规范
总结了一下公司正在用 jmeter 脚本规范. 使用 jmeter 进行接口级测试, 随着接口增多以及业务逻辑越来越复杂, 导致 jmeter 脚本的维护会更加困难.针对实际使用中发现的问题进行一些规 ...
- Hi3531 SDK 安装以及升级使用说明
Hi3531 SDK 安装以及升级使用说明 第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明 如果您是首次安装本SDK,请直接参看第2章. 第二章 首次安装SDK 1.Hi ...
- 航空客户价值分析特色LRFMC模型——RFM升级
本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...
- windows 7蓝屏解决办法
1.通过工具打开出现蓝屏原因的dmp文件,找到原因 Unable to load image \SystemRoot\system32\ntkrnlpa.exe, Win32 error 0n2 2. ...
- Java生成文件夹
Java生成文件夹 1.说明 判断文件夹是否存在,如果不存在就创建该文件夹,并打印其路径:如果存在,打印其路径 2.实现源码 /** * @Title:BuildFolder.java * @Pack ...