《C++新经典设计模式》之第9章 命令模式

《C++新经典设计模式》之第9章 命令模式

        • 命令模式.cpp

命令模式.cpp
#include <iostream>
#include <list>
#include <memory>
using namespace std;// 5种角色
// Receiver(接收者),Cook,提供请求业务的处理接口
// Invoker(调用者),Waiter,发送请求,通过命令对象执行请求
// Command(抽象命令),声明执行操作的接口
// ConcreteCommand(具体命令),通过调用Receiver相关操作执行请求
// Client(客户端),创建具体命令并设定接收者,创建调用者并驱动执行命令动作// 将请求或命令封装为对象,通过参数进行传递,对象化的对象可以排队执行或者撤销namespace ns1
{class Cook // 厨师类{public:void cook_fish() { cout << "fish" << endl; } // 做红烧鱼void cook_meat() { cout << "meat" << endl; } // 做锅包肉};class Command // 厨师做的每样菜品对应的抽象类{protected:shared_ptr<Cook> m_pcook;public:Command(const shared_ptr<Cook> &pcook) : m_pcook(pcook) {}virtual ~Command() {}virtual void Execute() = 0;};class CommandFish : public Command // 做红烧鱼菜品命令(顾客下的红烧鱼菜品便签){public:CommandFish(const shared_ptr<Cook> &pcook) : Command(pcook) {}void Execute() override { m_pcook->cook_fish(); }};class CommandMeat : public Command // 做锅包肉菜品命令(顾客下的锅包肉菜品便签){public:CommandMeat(const shared_ptr<Cook> &pcook) : Command(pcook) {}void Execute() override { m_pcook->cook_meat(); }};class Waiter0 // 服务员类{shared_ptr<Command> m_pcommand; // 服务员手中握着顾客书写的菜品便签public:void SetCommand(const shared_ptr<Command> &pcommand) { m_pcommand = pcommand; } // 顾客将便签交给服务员void Notify() { m_pcommand->Execute(); }                                        // 服务员将便签交到厨师手里让厨师开始做菜};class Waiter{private:// 一个便签中可以包含多个菜品甚至可以一次收集多个顾客的便签,达到一次性通知厨师做多道菜的效果list<shared_ptr<Command>> m_commlist; // 菜品列表,每道菜品作为一项,如果一个便签中有多个菜品,则这里将包含多项public:// 将顾客的便签增加到便签列表中,即便一个便签中包含多道菜品,这也相当于一道一道菜品加入到列表中void AddCommand(const shared_ptr<Command> &pcommand){m_commlist.push_back(pcommand);}void DelCommand(const shared_ptr<Command> &pcommand) // 如果顾客想撤单则将便签从列表中删除{m_commlist.remove(pcommand);}void Notify() // 服务员将所有便签一次性交到厨师手里让厨师开始按顺序做菜{for (auto iter = m_commlist.cbegin(); iter != m_commlist.cend(); ++iter) // 依次让厨师做每一道菜品(*iter)->Execute();}};
}namespace ns2
{class Cook // 厨师类{public:void cook_fish() { cout << "fish" << endl; } // 做红烧鱼void cook_meat() { cout << "meat" << endl; } // 做锅包肉};class Command // 厨师做的每样菜品对应的抽象类{protected:shared_ptr<Cook> m_pcook;public:Command(const shared_ptr<Cook> &pcook) : m_pcook(pcook) {}virtual ~Command() {}virtual void Execute() = 0;};class CommandFish : public Command // 做红烧鱼菜品命令(顾客下的红烧鱼菜品便签){public:CommandFish(const shared_ptr<Cook> &pcook) : Command(pcook) {}void Execute() override { m_pcook->cook_fish(); }};class CommandMeat : public Command // 做锅包肉菜品命令(顾客下的锅包肉菜品便签){public:CommandMeat(const shared_ptr<Cook> &pcook) : Command(pcook) {}void Execute() override { m_pcook->cook_meat(); }};class Traineewaiter // 实习服务员类{shared_ptr<Command> m_pcommand; // 实习服务员手中握着顾客书写的菜品便签public:Traineewaiter(const shared_ptr<Command> &pcommand) : m_pcommand(pcommand) {}void Notify() // 实习服务员将便签交到厨师手里让厨师开始做菜{if (m_pcommand != nullptr)m_pcommand->Execute();}};
}namespace ns3
{class Cook // 厨师类{public:void cook_fish() { cout << "fish" << endl; } // 做红烧鱼void cook_meat() { cout << "meat" << endl; } // 做锅包肉};class Command // 厨师做的每样菜品对应的抽象类{protected:shared_ptr<Cook> m_pcook;public:Command(const shared_ptr<Cook> &pcook = nullptr) : m_pcook(pcook) {}virtual ~Command() {}virtual void Execute() = 0;};class CommandFish : public Command // 做红烧鱼菜品命令(顾客下的红烧鱼菜品便签{public:CommandFish(const shared_ptr<Cook> &pcook = nullptr) : Command(pcook) {}void Execute() override{if (m_pcook != nullptr)m_pcook->cook_fish();}};class CommandMeat : public Command // 做锅包肉菜品命令(顾客下的锅包肉菜品便签){public:CommandMeat(const shared_ptr<Cook> &pcook = nullptr) : Command(pcook) {}void Execute() override{if (m_pcook != nullptr)m_pcook->cook_meat();}};class CommandMacro : public Command // 宏命令:把多个命令组合{list<shared_ptr<Command>> m_commlist;public:void AddCommand(const shared_ptr<Command> &pcommand){m_commlist.push_back(pcommand);}virtual void Execute(){for (auto iter = m_commlist.cbegin(); iter != m_commlist.cend(); ++iter)(*iter)->Execute();}};class Traineewaiter // 实习服务员类{shared_ptr<Command> m_pcommand; // 实习服务员手中握着顾客书写的菜品便签public:Traineewaiter(const shared_ptr<Command> &pcommand = nullptr) : m_pcommand(pcommand) {}void Notify() // 实习服务员将便签交到厨师手里让厨师开始做菜{if (m_pcommand != nullptr)m_pcommand->Execute();}};
}namespace ns4
{class TC{public:void operator()(int tv){cout << "TC::operator(int tv), tv=" << tv << endl;}public:int operator()(int tv1, int tv2){cout << "TC::operator(int tv1, int tv2), tv1=" << tv1 << ", tv2=" << tv2 << endl;return tv1 + tv2;}};template <class T>          // T代表可调用对象的类型void functmptest(T callobj) // callobj是个可调用对象{callobj(100);}
}int main()
{
#if 0using namespace ns1;shared_ptr<Cook> pcook(new Cook());pcook->cook_fish();pcook->cook_meat();
#endif#if 0using namespace ns1;shared_ptr<Cook> cook(new Cook());shared_ptr<Command> pcmd1(new CommandFish(cook));pcmd1->Execute(); // 做红烧鱼shared_ptr<Command> pcmd2(new CommandMeat(cook));pcmd2->Execute(); // 做锅包肉
#endif#if 0using namespace ns1;shared_ptr<Cook> cook(new Cook());shared_ptr<Command> pcmd1(new CommandFish(cook));shared_ptr<Command> pcmd2(new CommandMeat(cook));shared_ptr<Waiter0> pwaiter(new Waiter0());pwaiter->SetCommand(pcmd1);pwaiter->Notify(); // 做红烧鱼pwaiter->SetCommand(pcmd2);pwaiter->Notify(); // 做锅包肉
#endif#if 0using namespace ns1;shared_ptr<Cook> cook(new Cook());shared_ptr<Command> pcmd1(new CommandFish(cook));shared_ptr<Command> pcmd2(new CommandMeat(cook));shared_ptr<Waiter> pwaiter(new Waiter());// 把多道菜品分别加入到菜品列表中pwaiter->AddCommand(pcmd1);pwaiter->AddCommand(pcmd2);// 服务员一次性通知厨师做多道菜pwaiter->Notify();
#endif#if 0using namespace ns2;shared_ptr<Cook> cook(new Cook());shared_ptr<Command> pcmd1(new CommandFish(cook));shared_ptr<Command> pcmd2(new CommandMeat(cook));shared_ptr<Traineewaiter> pwaitersx1(new Traineewaiter(pcmd1));pwaitersx1->Notify(); // 做红烧鱼shared_ptr<Traineewaiter> pwaitersx2(new Traineewaiter(pcmd2));pwaitersx2->Notify(); // 做锅包肉
#endif#if 0using namespace ns3;shared_ptr<Cook> cook(new Cook());shared_ptr<Command> pcmd1(new CommandFish(cook));shared_ptr<Command> pcmd2(new CommandMeat(cook));shared_ptr<CommandMacro> pcmd(new CommandMacro());shared_ptr<Traineewaiter> pwaiter(new Traineewaiter(pcmd));pcmd->AddCommand(pcmd1);pcmd->AddCommand(pcmd2);pwaiter->Notify();
#endif#if 1using namespace ns4;TC tc;tc(20); // 调用的是()操作符,这就是个可调用对象。等价于tc.operator()(20);cout << tc(30, 50) << endl;functmptest(tc);
#endifcout << "Over!\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标书整体实施方案

一、标书整体实施方案概述 标书整体实施方案是一种全面、系统的方法&#xff0c;旨在确保标书的顺利完成和成功实施。它涵盖了从项目背景到招标文件分析&#xff0c;再到投标文件编制和投标的全过程。实施方案不仅提供了明确的工作流程和分工&#xff0c;还为整个标书制作团队…

针对网页html中插入动图gif不能循环播放只播放一次的解决方案

针对网页html中插入动图gif不能循环播放只播放一次的解决方案 原因分析解决方案 原因分析 使用图片编辑软件制作的过程中未启用“循环播放”功能&#xff0c;这里以Photoshop为例&#xff0c;演示设置GIF图片循环播放的操作流程&#xff1a;所需材料&#xff1a;PS。第一步&am…

MongoDB——模糊查询的两种方法

方法一&#xff1a;类似于结构性数据库的like db.users.find({fname: /zhangsan/}); 对应mysql的like用法&#xff1a;select * from users where fname like %zhangsan%; &#xff08;1&#xff09;如果要模糊查询以什么开头&#xff0c;方法如下&#xff1a; db.users.fi…

图灵日记之Leetcode删除有序数组中的重复项合并两个有序数组移除链表元素

题目 删除有序数组中的重复项题目入口题目内容思路代码c版本c嘎嘎版本 合并两个有序数组题目链接题目内容思路代码c版本(c嘎嘎版本与c版本内容一样) 移除链表元素题目链接题目内容思路1代码1思路2代码2思路3代码3 删除有序数组中的重复项 题目入口 题目内容 给你一个 非严格…

抖音ip地址切换什么原因

在如今的互联网世界中&#xff0c;抖音已经成为了一个非常受欢迎的应用程序&#xff0c;让人们可以通过短视频来分享生活点滴。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;比如在使用抖音时需要进行IP地址切换。那么&#xff0c;为什么要切换IP地址呢&#xff1…

拼多多买家页面批量导出订单excel

拼多多买家页面批量导出订单excel 由于拼多多不支持订单导出excel清算起来很麻烦&#xff0c;就自己写了一个页面批量导出脚本代码。 首先打开拼多多手机端网站&#xff1a;https://mobile.pinduoduo.com/ 登录后点击我的订单打开f12审查元素 在控制台引入jquery&#xff0c;引…

IIC需要外部上拉电阻

由于I2C接口采用Open Drain机制&#xff0c;器件本身只能输出低电平&#xff0c;无法主动输出高电平&#xff0c;只能通过外部上拉电阻RP将信号线拉至高电平。 因此I2C总线上的上拉电阻是必须的&#xff01; 所以开发板上面的IIC如果没有外接上拉电阻&#xff0c;是无法使用该I…

【go语言开发】本地缓存的使用,从简单到复杂写一个本地缓存,并对比常用的开源库

本文主要介绍go语言中本地缓存的使用&#xff0c;首先由简单到复杂手写3个本地缓存示例&#xff0c;使用内置的sync&#xff0c;map等数据结构封装cache&#xff0c;然后介绍常见的一些开源库&#xff0c;以及对比常用的开源库 文章目录 前言手写本地缓存CacheNormalCacheExCac…

halcon3

*外焊缝检测 *读取图片 *遍历文件夹 list_files (D:/D程序/外焊缝方案/碳钢方 - 外/30000, files, Files) *文件格式筛选 tuple_regexp_select (Files, .*, ImageFiles) *依次读取图片 for I := 1 to |ImageFiles|-1 by 1 read_image (Image, ImageFiles[I]) dev_close_windo…

基于单片机的太阳能数据采集系统(论文+源码)

1. 系统设计 在本次太阳能数据采集系统的设计中&#xff0c;以AT89C52单片机为主要核心&#xff0c;主要是由LCD液晶显示模块、存储模块、温度检测模块、串口通信模块&#xff0c;光照检测模块等组成&#xff0c;其实现了对太阳能板的温度&#xff0c;光照强度的检测和记录&…

SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法

AND 运算符 SQL的AND运算符用于根据多个条件筛选记录&#xff0c;确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法&#xff1a; SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...; • column1, column2,等是您…

SpringBoot2—开发实用篇3

目录 整合第三方技术 缓存 SpringBoot内置缓存解决方案 SpringBoot整合Ehcache缓存 SpringBoot整合Redis缓存 SpringBoot整合Memcached缓存 SpringBoot整合jetcache缓存 SpringBoot整合j2cache缓存 任务 Quartz Task 邮件 消息 Java处理消息的标准规范 购物订单…

git 常见错误总结(会不断更新中。。)

常见错误 1. 配置部署key后git clone还是拉不下代码 执行以下命令 先添加 SSH 密钥到 SSH 代理&#xff1a; 如果你使用 SSH 代理&#xff08;例如 ssh-agent&#xff09;&#xff0c;将生成的私钥添加到代理中。 ssh-add ~/.ssh/gstplatrontend/id_rsa如果报错以下错误信息…

详谈前端中常用的加/密算法

本文主要详细介绍了在前端开发中常用的加/解密算法&#xff0c;以及前端如何实现。 总的来说&#xff1a;前端加密无论使用哪个加密都一样是有可能性被他人获取到相关的公钥或密钥的&#xff08;比如&#xff1a;拦截请求、查看源代码等&#xff09;&#xff0c;然后进行加密与…

pytorch--基于语音的性别识别

pytorch官网 基于梅尔频谱的语音性别分类模型&#xff0c;训练了20epoch&#xff0c;准确率97% 提升点有很多&#xff1a;还可以基于声纹特征作为训练集、数据预处理的逻辑、transform的逻辑&#xff08;修改transform会导致数据的张量维度变更&#xff0c;可能需要更改模型结…

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-LSTM模型预测 3.1 数据加载&…

中医处方软件西医电子处方系统,一键生成处方单可设置配方模板教程

一、前言 有的诊所是中医和西医都有&#xff0c;医师是全科医师&#xff0c;那么所使用的软件既要能开中药处方也要能开西药处方&#xff0c;而且可以通过一键生成配方&#xff0c;则可以节省很多时间。 下面就以 佳易王诊所卫生室电子处方为例说明 如上图&#xff0c;如果是…

151.翻转字符串里的单词

题目描述 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1: 输入: "the sky is blue" 输出: "blue is sky the"示例 2: 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多…

【C++】POCO学习总结(十七):日志系统(级别、通道、格式化、记录流)

【C】郭老二博文之&#xff1a;C目录 1、Poco::Message 日志消息 1.1 说明 所有日志消息都在Poco::Message对象中存储和传输。 头文件&#xff1a;#include “Poco/Message.h” 一条消息包含如下内容&#xff1a;优先级、来源、一个文本、一个时间戳、进程和线程标识符、可选…

Kafka中的fetch-min-size、fetch-max-wait和request.timeout.ms配置

当前kafka的版本为2.8.11&#xff0c;Spring Boot的版本为2.7.6&#xff0c;在pom.xml中引入下述依赖&#xff1a; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.11<…