C++ 命令模式

什么是命令模式?

  • 将请求转换为一个包含与请求相关的所有信息的独立对象。从而使你可以用不同的请求方法进行参数化,并且能够对请求进行排队、记录请求日志以及撤销请求操作。
  • 命令模式属于行为设计模式

如何理解命令模式

命令模式很像我们订外卖(淘宝),用户下单,订单中包裹了商户的信息及订餐数量,外卖平台作为接收者将订单再通知到商户,商户执行操作。

命令模式的步骤

源自ChatGpt的总结

  1. 定义一个 Command 抽象类,它声明了一个抽象的 execute() 方法,该方法用于执行命令。
  2. 创建一个实现了 Command 抽象类的实体类,该类实现了 execute() 方法,用于执行具体的命令。
  3. 创建一个 Invoker 类,该类持有 Command 类的一个实例,并调用实例的 execute() 方法来实现命令的调用。
  4. 创建客户端,在客户端中创建一个具体的 Command 对象,并设置它的接收者。
  5. 创建 Invoker 对象,并将创建的 Command 对象设置到 Invoker 对象中。
  6. 调用 Invoker 对象的 execute() 方法来执行命令。

代码描述

我们这里用户头像为例子

  • 首先需要接口类
/*通用命令*/
class Command {
public:virtual ~Command() {}virtual void Execute() const = 0;
};
/*通用处理人*/
class Receiver {
public:virtual void DoFuncA(const int a)     = 0;virtual void DoFuncB(const int b) = 0;
};
  • 创建具体命令
/*实例化一个厨师类的处理人*/
class CookReceiver : public Receiver {
public:explicit CookReceiver(const std::string& cook_name) : cook_name_(cook_name) {}void DoFuncA(const int a) { std::cout << "->cook " << cook_name_ << " Receiver: Working sum= " << a << std::endl; }void DoFuncB(const int b){std::cout << "->cook " << cook_name_ << "  Receiver: Working food weight=" << b << std::endl;}private:std::string cook_name_;
};
/*实例化一条简单命令*/
class MilkCommand : public Command {
private:int sum_;public:explicit MilkCommand(int sum) : sum_(sum) {}void Execute() const override { std::cout << "->The customer need milk= " << this->sum_ << std::endl; }
};
/*实例化一条复杂的命令*/
class SteakCommand : public Command {public:explicit SteakCommand(std::shared_ptr<Receiver> receiver_cook, int sum, int weight): sum_(sum), weight_(weight), receiver_cook_(receiver_cook){}void Execute() const override{std::cout << "->The customer ordered a steak" << std::endl;this->receiver_cook_->DoFuncA(this->sum_);this->receiver_cook_->DoFuncB(this->weight_);}private:std::shared_ptr<Receiver> receiver_cook_;int                       sum_    = 0;int                       weight_ = 0;
};
  • 通过中心来分配执行命令
/*饭店前台*/
class Invoker {
private:vector<std::shared_ptr<Command>> command_list_;public:~Invoker() { command_list_.clear(); }void InsertFontCommand(std::shared_ptr<Command> command) { command_list_.insert(command_list_.begin(), command); }void PushBackCommand(std::shared_ptr<Command> command) { command_list_.push_back(command); }void ExecuteCommand(){std::cout << "The customer order start execute!" << std::endl;for (auto& item_command : command_list_) {item_command->Execute();}std::cout << "The customer order finished!" << std::endl;}
};
  • 创建用户命令并执行
int main()
{//饭店前台auto invoker            = std::make_shared<Invoker>();//创建厨师小明auto receiver_cook_user = std::make_shared<CookReceiver>("xiao ming");//订购牛排并指定小明厨师制作invoker->PushBackCommand(make_shared<SteakCommand>(receiver_cook_user, 5, 100));//订购牛奶invoker->InsertFontCommand(make_shared<MilkCommand>(5));//执行订单invoker->ExecuteCommand();return 0;
}
  • 输出结果如下
    在这里插入图片描述

命令模式的思考

优点:

  • 单一职责,实现了触发和执行的解耦操作;
  • 复合开闭原则,无需修改原有代码,就可增加新的命令
  • 可以把多个操作组合成一个复杂的命令,从而实现复杂的逻辑
  • 排队中的操作命令可以排序或撤销
  • 维护日志方便,更好的回溯操作

缺点:

  • 简单的逻辑套用命令模式,由于中间传递调用者的加入会变得复杂
  • 如果命令过多,很容易出现类数量膨胀的情况

总结:

  • 如果遇到复杂的问题,尤其是客户端这种,命令模式是一种很好的解耦UI和逻辑的设计方式

命令模式与其他模式的比较

  • 命令在发送者和请求者之间建立单向连接

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

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

相关文章

如何设计一份问卷?

问卷是一种非常好的数据收集方式&#xff0c;问卷有着小巧灵活轻便的天生优越性&#xff0c;简单方便&#xff0c;任何人都能设计一份问卷数据&#xff0c;然后进行数据分析和研究。但可曾知&#xff0c;糟糕的问卷设计会带来糟糕的数据分析&#xff0c;无法得到预期结果&#…

如何设计调查问卷?

想要做好一份调查问卷要明确哪几点&#xff1f; 一、问卷三要素 1、问卷主题 我们使用调查问卷法进行调查的时候&#xff0c;首先要明确主题是什么&#xff0c;是关于人员满意度调查、人员喜好类型调查还是其他主题。明确主题后我们才可以进行接下来的动作。 2、调查人群 …

调查问卷分析

调查问卷数据及分析&#xff1a; 1. 在统计数据中大一和大二的学生占大多数 2. 由此可以看出大部分只是偶尔看看&#xff0c;还有许多从没有浏览过&#xff0c;针对没有浏览过的人我们设计了下面的问题&#xff1a; 3. 可以看到&#xff0c;在没有使用过bbs的人中其实有很多…

问卷调查页面的设计与实现

问卷调查页面的设计与实现 功能要求&#xff1a; 1.用户可以根据调查问题进行单选、多选以及在结尾处填写姓名、职位和联系电话等信息。 2. 每个输入栏目的文本框均需要显示提示信息。 3. 用户在点击按钮提交注册信息时可以验证所有栏目均为必填项以及电子邮箱的有效性。 实现…

仿造问卷星--开发一套调查问卷设计工具(1/3)--完整流程

一&#xff0c;开发前的准备 第一步&#xff0c;初始化项目 创建package.json 首先&#xff0c;新建一个空文件夹项目&#xff0c;在空文件上按shift键同时鼠标右击&#xff0c;打开命令终端窗口 npm init第二步&#xff0c;安装项目依赖 Parcel 快速部署工具&#xff0c;…

问卷调查系统的设计与实现【源码:文档:教程】

Goddess-Questionnaire女神问卷 各位大神若有项目问题可进群有小伙伴解答 女神问卷演示视频&#xff08;问卷部分&#xff09;&#xff1a;https://v.youku.com/v_show/id_XNDI3Mjc5MzExMg.html?spma2h3j.8428770.3416059.1 女神问卷全部视频演示&#xff1a;https://v.youk…

分享如何设计调查问卷怎样分析问卷数据!

又快到了写论文的时候了&#xff0c;有小伙伴论文采用了问卷调查方法&#xff0c;但不是特别清楚具体的问卷设计和数据分析流程。 今天就和大家说说整个流程&#xff1a;怎么设计一份合格的问卷以及怎么对问卷数据进行分析&#xff1f; 一、问卷设计步骤 如果是学术研究&…

如何使用obs采集视频流/推流

首先 下载obs 这是一个开源的视频采集软件/推流工具 首先添加视频源 选择浏览器 或者别的什么摄像头什么的都可以 然后点击左上角的文件 点击直播 这里有一个点就是服务器的url rtmp://服务器地址/:1935/live/live 至于为什么是这样 我也没有深入了解 推流码 如果你只是测…

rtmp推流和拉流

提前说明&#xff0c;文章所用主要摘自网络&#xff0c;本文只是整合。鉴于来源太多&#xff0c;不进行引用说明 NGINX 安装nginx及安装nginx模块 nginx下载地址 http://nginx.org/download/nginx-1.20.1.tar.gz nginx-rtmp模块 组件下载地址 https://github.91chifun.w…

使用nginx进行rtmp直播推流拉流

使用nginx进行rtmp直播推流拉流 现在社会&#xff0c;直播越来越普通&#xff0c;网红流量社会&#xff0c;到底直播是怎么进行的呢&#xff0c;我们来尝试在本地搭建直播环境 搭建服务器 服务器我们选用高稳定性、高并发的web服务器nginx&#xff0c;利用nginx中的rtmp模块进…

【视频】使用VLC采集摄像头,以RTSP协议发送流到网络上

【目录】郭老二博文之:图像视频汇总 1、VLC官网 http://www.videolan.org/ 1.1 VLC3.0.1搭建失败 本人使用VLC3.0.1,搭建失败,总报无法打开URL 1.2 VLC2.1.5搭建成功 VLC2.1.5官网地址及下载地址 www.videolan.org/vlc/releases/2.1.5.html http://get.videolan.org/v…

视频推流与拉流

视频推流拉流概念&#xff0c;我认为这个哥们的图挺不错 概念 推流 推流&#xff0c;指的是把采集阶段封包好的内容传输到服务器的过程。 主流的推送协议和优缺点 RTMP RTMP是Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;的缩写&#xff0c;是Ado…

视频-摄像机-推流

本文主要介绍使用 WVPZLMediaKitMediaServerUI 实现通过 GB28181 进行海康、大华、宇视等品牌的 IPC、NVR 、DVR 接入&#xff0c;完成摄像头监控播放&#xff0c;控制&#xff0c;录制。 一、概念 IPC是&#xff08;IP Camera 即网络摄像机&#xff09;缩写&#xff0c;由网…

RTP协议转发视频流

RTP转发 做完上次的读取摄像头之后&#xff0c;项目需要将视频转发给客户端&#xff0c;所以研究了下RTP并且做了一个小程序测试功能&#xff0c;现在分享出来。 原料&#xff1a;VS2017&#xff0c;RTP.NET&#xff0c;摄像头 语言&#xff1a;C# 标签&#xff1a;EmguCV&…

实时视频流播放 和 流 推流器

ffmpeg学习&#xff08;二&#xff09; 通过rtsp获取H264裸流并保存到mp4文件 顾文锦 2014-9-24 11:06:51 阅读(2853) 评论(0) 本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中。 1、VS2010建…

RTMP推流平台/视频直播点播分析平台/人脸识别系统EasyDSS如何实现RTMP负载均衡?

负载均衡实际上是我们集群的时候提到的一个概念&#xff0c;作为有集群需要的视频直播点播平台EasyDSS&#xff0c;我们在实现多路推流的时候&#xff0c;也需要做到RTMP负载均衡。如何在EasyDSS上实现RTMP负载均衡将是我们在本文中主要讨论的问题。 负载均能能够提供一种廉价、…

基于Gstreamer的实时视频流的分发

1 Overview Gstreamer是一款功能强大、易扩展、可复用的、跨平台的用流媒体应用程序的框架。 该框架大致包含了应用层接口、主核心框架以及扩展插件三个部分。 Fig 1.0Gstreamer 应用层接口主要是给各类应用程序提供接口如&#xff1a;多媒体播放器、流媒体服务器、视频编辑…

ChatGPT还没玩明白,自主人工智能已经来了

Datawhale干货 最新&#xff1a;AutoGPT&#xff0c;来源&#xff1a;机器之心 OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#x…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; Hugging Face&#xff0c;作为 AI 开源圈最为知名的「网红」创业公司&#xff0c;成立仅几年&#xff0c;便在 GitHub 开源了诸多实用开源项目&#xff0c;受到了不少开发者的赞赏。 其中影…

这对情侣火了,你猜是因为啥

注意看&#xff0c;这张情侣照在网上转疯了&#xff1a; —— 本文转载自量子位 旧厂街风格&#xff0c;带着浓浓90年代氛围感&#xff0c;但是&#xff0c;他俩一夜爆火的原因&#xff0c;你可能想象不到—— 这二位并不是真人&#xff01;而是由AI一键生成的&#xff01; &am…