当前位置: 首页 > news >正文

【设计模式】命令模式

命令模式是一种行为设计模式。将一系列操作,封装为类(命令),使用队列保存历史命令,实现撤销undo操作。

  • Command:抽象命令类。
  • ConcreteCommand:具体命令类,依赖Receiver类执行不同命令。
  • Invoker:调用者类,持有命令队列,触发命令。
  • Receiver:concreteCommand操作的对象,执行具体的命令。
  • Client:调用Invoker触发命令。
#include <iostream>
#include <stack>
#include <memory>//底层执行
class Receiver
{
public:Receiver()=default;~Receiver()=default;Receiver(const Receiver& another){this->str_ = another.str_; }Receiver& operator=(Receiver& another){if(&another==this)return *this;this->str_ = another.str_; return *this;}Receiver(Receiver&& another){this->str_ = std::move(another.str_);}Receiver& operator=(Receiver&& another){if(&another==this)return *this;this->str_ = std::move(another.str_);return *this;}std::string Do()const{return str_;}
private:std::string str_{"do something..\n"};
};class Command
{
public:Command()=default;virtual ~Command()=default;virtual void Execute()=0;virtual void Undo()=0;
};//封装底层执行,暴露命令或操作
class PasteCommand:public Command
{
public:PasteCommand(Receiver receiver){receiver_ = std::move(receiver);}virtual void Execute()override{ std::cout<<receiver_.Do()<<"\n";}virtual void Undo()override{std::cout<<"un"<<receiver_.Do()<<"\n";}
private:Receiver receiver_;
};//记录历史操作。触发操作、undo操作。
class Invoker
{
public://通过SetCommand进行依赖注入(或改为构造)void SetCommand(std::unique_ptr<Command> command){this->command_ = std::move(command);}void Click(){command_->Execute();history_.push(std::move(command_));}void Undo(){auto last = std::move(history_.top());last->Undo();history_.pop();}
private:std::unique_ptr<Command> command_{nullptr};std::stack<std::unique_ptr<Command>> history_;
};int main()
{Receiver receiver;std::unique_ptr<Command> upc = std::make_unique<PasteCommand>(receiver);Invoker invoker;invoker.SetCommand(std::move(upc)); invoker.Click();invoker.Undo();return 0;
}
http://www.jsqmd.com/news/758742/

相关文章:

  • 终极指南:Microsoft REST API中的可空属性设计与可选字段处理策略
  • 强力淘金币自动化:彻底解放淘宝用户的时间与精力
  • 即梦怎么去水印?2026最新 最全去水印手机方法和工具盘点 - 爱上科技热点
  • 2026年OpenClaw如何部署?阿里云及Coding Plan配置保姆级指南
  • 从爬虫到文件下载:Hutool HttpUtil在Java项目中的5个实战场景(含进度监控与代理配置)
  • AI就业影响研究报告:哪些工作最危险? - AI Prism 智棱
  • 2026 武汉GEO服务商全景评测:五大头部机构实力解析 - GEO优化
  • 2026最新年抖音视频怎么提取无水印版本?官方下载无水印视频的全方法盘点 - 爱上科技热点
  • 英雄联盟智能助手终极指南:5大高效功能提升你的游戏体验 [特殊字符]
  • 自参考强化学习SRPO在多模态任务中的高效优化
  • 061、Python图像处理基础:PIL/Pillow库实战笔记
  • Unity UI实战:用Slider组件5分钟搞定一个音量调节面板(附完整C#脚本)
  • 在线去本地视频水印的工具有哪些?免费在线去除视频水印工具怎么挑?2026最新 在线去本地视频水印工具推荐 - 爱上科技热点
  • 从CentOS停服倒计时到信创达标验收:Docker 27引擎国产化适配的27天极速通关路径(附工信部认证测试用例集)
  • GME-Qwen2-VL-2B-Instruct图文检索教程:消费级GPU(RTX 3090/4090)适配指南
  • 抖音视频怎么在线去水印?2026最新 抖音视频在线去水印方法,抖音视频在线去水印工具推荐 - 爱上科技热点
  • 2026最新年免费一键去水印工具盘点|一键去水印工具推荐排行榜 - 爱上科技热点
  • 即梦AI去除水印怎么做?2026最新实测教程+工具对比指南 - 爱上科技热点
  • 2026最新年抖音图片去水印最新方法|抖音保存图片怎样去掉水印?4款工具实测对比 - 爱上科技热点
  • 去水印工具免费版哪个好用?2026最新 免费去水印工具对比,免费好用的去水印工具推荐盘点 - 爱上科技热点
  • Trestle高级特性解析:作用域、工具栏和模态框
  • 2026 苏州GEO服务商全景评测:五大头部机构实力解析 - GEO优化
  • 终极RPG Maker资源解密工具:专业解锁加密游戏档案的完整指南
  • 抖音视频怎么去水印?2026最新年最新去水印方法和工具实测对比 - 爱上科技热点
  • Maple Mono字体深度解析:如何通过开源等宽字体提升编程效率与视觉体验
  • 机械臂厂家采购必看!大件设备包装选错,全是运输损耗
  • [LabVIEW随笔-13] -ActorFramework-创建第一个Actor
  • 微信里哪个小程序能免费去水印?2026最新 微信免费去水印小程序推荐实测 - 爱上科技热点
  • 无水印视频下载神器哪个好?2026最新 无水印视频下载工具推荐,无水印视频下载神器盘点 - 爱上科技热点
  • 免疫研究必备:手把手教你用R包fgsea分析免疫特征基因集(附最新c7数据库使用指南)