/************************************************************************ * 命令模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.09 * Compiler: VC8 ************************************************************************/ #define _TESTONE_ #include "CommandPattern.h" #ifdef _TESTONE_ #include "CommandPattern1.h" #else //#include "CommandPattern2.h" #endif #include <iostream> using namespace std; int main() { //------------------命令模式原理类测试------------------- CReceiver *r = new CReceiver(); CCommand *c = new CConcreteCommand( r ); CInvoker *i = new CInvoker(); i->vSetCommand( c ); i->vExecuteCommand(); delete(r); r = NULL; delete(c); c = NULL; delete(i); i = NULL; #ifdef _TESTONE_ //------------------烤羊肉串类测试一------------------- // 开店前的准备 CBarbecuer *boy = new CBarbecuer(); CCommand *bakeMuttonCommand1 = new CBakeMuttonCommand( boy ); CCommand *bakeMuttonCommand2 = new CBakeMuttonCommand( boy ); CCommand *bakeChickenWingCommand1 = new CBakeChickenWingCommand( boy ); CWaiter *girl = new CWaiter(); // 开门营业 girl->vSetOrder( bakeMuttonCommand1 ); girl->vNotify(); girl->vSetOrder( bakeMuttonCommand2 ); girl->vNotify(); girl->vSetOrder( bakeChickenWingCommand1 ); girl->vNotify(); delete(boy); boy = NULL; delete(bakeMuttonCommand1); bakeMuttonCommand1 = NULL; delete(bakeMuttonCommand2); bakeMuttonCommand2 = NULL; delete(bakeChickenWingCommand1); bakeChickenWingCommand1 = NULL; #else //------------------烤羊肉串类测试二------------------- // 开店前的准备 //CBarbecuer *boy = new CBarbecuer(); //CCommand *bakeMuttonCommand1 = new CBakeMuttonCommand( boy ); //CCommand *bakeMuttonCommand2 = new CBakeMuttonCommand( boy ); //CCommand *bakeChickenWingCommand1 = new CBakeChickenWingCommand( boy ); //CWaiter *girl = new CWaiter(); 开门营业 //girl->vSetOrder( bakeMuttonCommand1 ); //girl->vSetOrder( bakeMuttonCommand2 ); //girl->vSetOrder( bakeChickenWingCommand1 ); 订单下好后,一次通知 //girl->vNotify(); //delete(boy); //boy = NULL; //delete(bakeMuttonCommand1); //bakeMuttonCommand1 = NULL; //delete(bakeMuttonCommand2); //bakeMuttonCommand2 = NULL; //delete(bakeChickenWingCommand1); //bakeChickenWingCommand1 = NULL; #endif return 0; } /************************************************************************ * 总结: * 1、它能较容易地设计一个命令队列; * 2、在需要的情况下,可以较容易将命令记入日志; * 3、允许接收请求的一方决定是否要否决请求; * 4、可以容易地实现对请求的撤销和重做; * 5、由于加进新的具体命令类不影响其它类,因此增加具体的命令类很容易实现。 * 6、把请求的一个操作的对象与知道怎么执行一个操作的对象分隔开。 * 7、敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。 * 如果不清楚一个系统是否需要命令模式,一般不要急着去实现它,事实上 * 在需要的时候通过重构实现这个模式并不困难,只有真正需要如撤销/恢复 * 操作等功能时,把原来的代码重构为命令模式才有意义。 ************************************************************************/

#pragma once /********************************************** * 命令模式原理: * 将一个请求封装成对象,从而使你可以用不同的 * 请求对客户进行参数化;对请求排队或记录请求日志 * ,以及支持可撤销的操作。 ***********************************************/ #include <iostream> using namespace std; //--------------------------------------------- // CReceiver类 // 知道如何实施与执行一个与请求相关的操作,任何 // 类都可能作为一个接收者。 class CReceiver { public: void vAction() { cout << "执行请求!" << endl; } protected: private: }; //--------------------------------------------- // 命令接口类 // 用来声明执行操作的接口。 class CCommand { public: CCommand(){}; CCommand( CReceiver *receiver ) : mp_receiver(receiver) {}; virtual void vExecute(){}; protected: CReceiver *mp_receiver; private: }; //--------------------------------------------- // CConcreteCommand类 // 将一个接受者对象绑定于一个动作,调用接收者 // 相应的操作,实现vExecute() class CConcreteCommand : public CCommand { public: CConcreteCommand( CReceiver *receiver ) { CCommand::CCommand(receiver); } void vExecute() { mp_receiver->vAction(); } protected: private: }; //--------------------------------------------- // CInvoker类 // 要求该命令执行这个请求。 class CInvoker { public: void vSetCommand( CCommand *command ) { mp_command = command; } void vExecuteCommand() { mp_command->vExecute(); } protected: private: CCommand *mp_command; };

#pragma once /******************************** * * 命令模式应用:烤羊肉串一 * ********************************/ #include <iostream> #include <string> using namespace std; // 烤羊肉串者 class CBarbecuer { public: // 烤羊肉串 void vBakeMutton() { cout << "烤羊肉串!" << endl; } // 烤鸡翅 void vBakeChickenWing() { cout << "烤鸡翅!" << endl; } protected: private: }; // 抽象命令类 class CCommand { public: CCommand(){}; // 确定烤羊肉串是谁? CCommand( CBarbecuer *receiver ) : mp_receiver( receiver ) {}; // 执行命令 virtual void vExecuteCommand(){}; protected: CBarbecuer *mp_receiver; private: }; // 具体命令类 // 烤羊肉串命令 class CBakeMuttonCommand : public CCommand { public: CBakeMuttonCommand( CBarbecuer *receiver ) { CCommand::CCommand( receiver ); } // 具体命令类,执行时,执行具体的行为 void vExecuteCommand() { mp_receiver->vBakeMutton(); } protected: private: }; // 烤鸡翅命令 class CBakeChickenWingCommand : public CCommand { public: CBakeChickenWingCommand( CBarbecuer *receiver ) { CCommand::CCommand( receiver ); } // 具体命令类,执行时,执行具体的行为 void vExecuteCommand() { mp_receiver->vBakeChickenWing(); } protected: private: }; // 服务员类 class CWaiter { public: CWaiter(){}; // 设置订单 void vSetOrder( CCommand *command ) { mp_command = command; } // 通知执行 void vNotify() { mp_command->vExecuteCommand(); } protected: private: CCommand *mp_command; };

#pragma once /******************************** * * 命令模式应用:烤羊肉串二 * ********************************/ #include <iostream> #include <string> #include <vector> #include <ctime> using namespace std; // 烤羊肉串者 class CBarbecuer { public: // 烤羊肉串 void vBakeMutton() { cout << "烤羊肉串!" << endl; } // 烤鸡翅 void vBakeChickenWing() { cout << "烤鸡翅!" << endl; } protected: private: }; // 抽象命令类 class CCommand { public: CCommand(){}; // 确定烤羊肉串是谁? CCommand( CBarbecuer *receiver ) : mp_receiver( receiver ) {}; // 执行命令 virtual void vExecuteCommand(){}; virtual string strGetName() {return "";}; protected: CBarbecuer *mp_receiver; private: }; // 具体命令类 // 烤羊肉串命令 class CBakeMuttonCommand : public CCommand { public: CBakeMuttonCommand( CBarbecuer *receiver ) : m_str("烤羊肉串") { CCommand::CCommand( receiver ); } // 具体命令类,执行时,执行具体的行为 void vExecuteCommand() { mp_receiver->vBakeMutton(); } // 获取本道菜类型 string strGetName() { return m_str; } protected: private: string m_str; }; // 烤鸡翅命令 class CBakeChickenWingCommand : public CCommand { public: CBakeChickenWingCommand( CBarbecuer *receiver ) : m_str("烤鸡翅") { CCommand::CCommand( receiver ); } // 具体命令类,执行时,执行具体的行为 void vExecuteCommand() { mp_receiver->vBakeChickenWing(); } // 获取本道菜类型 string strGetName() { return m_str; } protected: private: string m_str; }; // 服务员类 class CWaiter { public: CWaiter(){}; // 设置订单 void vSetOrder( CCommand *command ) { if ( command->strGetName() == "烤羊肉串" ) { cout << "服务员:不好意思,羊肉串没了,请点其他的菜吧!" << endl; } else { mv_command.push_back( command ); time_t now_time; now_time = time(NULL); cout << "日志:增加订单:" << command->strGetName() << " 时间:" << now_time << endl; } } // 取消菜单 void vCancelOrder( CCommand *command ) { for ( vector<CCommand*>::iterator it = mv_command.begin(); it != mv_command.end(); ++it ) { if ( (*it) == command ) { it = mv_command.erase(it); time_t now_time; now_time = time(NULL); cout << "取消订单:" << (*it)->strGetName() << " 时间:" << now_time << endl; } } } // 通知执行 void vNotify() { for ( vector<CCommand*>::iterator it = mv_command.begin(); it != mv_command.end(); ++it ) { (*it)->vExecuteCommand(); } } protected: private: // 增加存放命令的容器 vector<CCommand*> mv_command; };

吃烧烤之命令模式学习笔记[C++版] 1相关推荐

  1. 吃烧烤之命令模式学习笔记[C++版]

    #pragma once /******************************** * * 命令模式应用:烤羊肉串二 * ********************************/ ...

  2. 金庸小说考试之模板方法模式学习笔记[C++版]

    /************************************************************************ * 模板方法模式学习笔记[C++] * Author ...

  3. Windows保护模式学习笔记(九)—— 2-9-9-12分页

    Windows保护模式学习笔记(九)-- 2-9-9-12分页 要点回顾 10-10-12分页 原理 环境配置 2-9-9-12分页 原理 PDPTE PDE PTE XD/NX标志位 环境配置 实验 ...

  4. Windows保护模式学习笔记(六)—— 10-10-12分页

    Windows保护模式学习笔记(六)-- 10-10-12分页 基本概念 4GB内存空间 有效地址-线性地址-物理地址 有效地址与线性地址 物理地址 控制寄存器:Cr3 10-10-12分页 实验:通 ...

  5. Windows保护模式学习笔记(五)—— 任务段任务门

    Windows保护模式学习笔记(五)-- 任务段&任务门 要点回顾 任务段 TSS (Task-state segment ) TR段寄存器 TR段寄存器的读写 TSS段描述符 实验:加载自定 ...

  6. Windows保护模式学习笔记(三)—— 长调用/短调用/调用门

    Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时: 总 ...

  7. Windows保护模式学习笔记(二)—— 代码跨段跳转

    Windows保护模式学习笔记(二)-- 代码跨段跳转 要点回顾 代码跨段跳转 执行流程 1)段选择子拆分 2)查表得到段描述符 3)权限检查 4)加载段描述符 5)代码执行 6)总结 一致代码段(共 ...

  8. Windows保护模式学习笔记(一)—— 段寄存器GDT表

    Windows保护模式学习笔记(一)-- 段寄存器&GDT表 保护模式 参考书籍: 一.段寄存器 段寄存器的结构 段寄存器的读写 段寄存器的属性 1)探测Attribute: 2)探测Base ...

  9. linux三剑客-sed命令的学习笔记

    本文为在B站上学习linux命令的学习笔记,视频出处为https://www.bilibili.com/video/BV1244y1e73a?p=23&spm_id_from=pageDriv ...

最新文章

  1. 循环神经网络 递归神经网络_如何用递归神经网络预测空气污染
  2. 回馈读者【赠技术书通知】
  3. spark RDD底层原理
  4. IndexedDB技术简介(一)(转)
  5. dll 源码_重新编译mono——Android动态更新dll
  6. 前端学习(1960)vue之电商管理系统电商系统之分类参数的基本结构
  7. laravel 记录sql语句
  8. maven没有resource文件夹_maven项目中没有resource文件夹的问题
  9. “壕”无人性!黄金版iPhone 13 Pro售价27万元起
  10. iphone-common-codes-ccteam源代码 CCCompile.h
  11. 【图像处理】基于matlab DWT图像处理【含Matlab源码 198期】
  12. QAC静态代码测试工具试用介绍_c/c++
  13. linux查看数据区块大小,Linux显示指定区块大小为1048576字节
  14. 3-8 B: 分离LZY的字符串
  15. STM32F4 ETR计数
  16. java打印一个空心六边形_六边形架构 Java 实现
  17. 微信公众号回复服务器参数错误,为什么微信文章网址在浏览器访问提示参数错误...
  18. 记一次抓取网页内容(二)
  19. readmemh函数引用的txt格式_memory - 在Verilog中,我尝试使用$ readmemb来读取.txt文件,但它仅在内存中加载xxxxx(不必担心) - 堆栈内存溢出...
  20. GORM v2 关联预加载Preload和Joins的区别

热门文章

  1. 天大2021年秋学期考试《基础会计》离线作业考核试题
  2. iOS:友盟SDK第三方登录 分享及友盟统计的使用
  3. 将本地项目上传至码云仓库
  4. Python实用文档(持更)
  5. 设计小白也能上手的软件有哪些?
  6. 《基本穿搭:适用一生的穿衣法则》总结
  7. 快应用信息流列表组件
  8. Linux 系统学习
  9. 浅谈Spark Livy
  10. 图解什么是一致性哈希算法