新闻中心

c++如何实现命令(Command)设计模式_c++行为型设计模式实战教程

2025-11-22
浏览次数:
返回列表
命令模式将请求封装为对象,便于参数化、队列化和撤销操作;其核心由Command、ConcreteCommand、Receiver、Invoker和Client组成;以C++实现电灯开关为例,通过解耦发送者与接收者,支持扩展与维护,适用于GUI、游戏及任务调度系统。

c++如何实现命令(command)设计模式_c++行为型设计模式实战教程

命令模式是一种行为型设计模式,它将请求封装成对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式还能支持撤销操作。在C++中,这种模式特别适用于需要解耦请求发送者和接收者的场景。

命令模式的核心角色

命令模式包含四个基本组成部分:

  • Command(命令接口): 定义执行操作的接口,通常是一个抽象类或纯虚函数。
  • ConcreteCommand(具体命令): 实现Command接口,持有对Receiver的引用,并在Execute中调用Receiver的具体方法。
  • Receiver(接收者): 真正执行请求的对象,包含具体的业务逻辑。
  • Invoker(调用者): 调用命令对象执行请求,不关心具体实现细节。
  • Client(客户端): 创建ConcreteCommand对象并设定其接收者。

基础实现示例

下面是一个简单的C++实现,模拟电灯的开关控制:

// Receiver:实际执行操作的类 class Light { public: void TurnOn() { std::cout command; public: void SetCommand(std::unique_ptr cmd) { command = std::move(cmd); } void PressButton() { if (command) { command->Execute(); } } };

使用方式如下:

int main() { Light livingRoomLight; LightOnCommand onCmd(livingRoomLight); LightOffCommand offCmd(livingRoomLight); RemoteControl remote; remote.SetCommand(std::make_unique(livingRoomLight)); remote.PressButton(); // 输出:Light is ON remote.SetCommand(std::make_unique(livingRoomLight)); remote.PressButton(); // 输出:Light is OFF return 0; }

支持撤销操作的扩展

命令模式的一个强大特性是支持撤销。只需在Command接口中增加Undo方法:

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA class Command { public: virtual ~Command() = default; virtual void Execute() = 0; virtual void Undo() = 0; }; class LightOnCommand : public Command { private: Light& light; public: explicit LightOnCommand(Light& l) : light(l) {} void Execute() override { light.TurnOn(); } void Undo() override { light.TurnOff(); } }; class LightOffCommand : public Command { private: Light& light; public: explicit LightOffCommand(Light& l) : light(l) {} void Execute() override { light.TurnOff(); } void Undo() override { light.TurnOn(); } };

RemoteControl 可记录上一个命令,实现撤销:

class RemoteControl { private: std::unique_ptr command; std::unique_ptr lastCommand; public: void SetCommand(std::unique_ptr cmd) { command = std::move(cmd); } void PressButton() { if (command) { command->Execute(); lastCommand = std::make_unique(*command); } } void PressUndo() { if (lastCommand) { lastCommand->Undo(); } } };

应用场景与优势

命令模式适合以下情况:

  • 需要参数化对象以执行某动作,比如菜单项绑定功能。
  • 支持操作入队、记录日志,便于恢复或重放。
  • 实现可撤销的操作,提升用户体验。
  • 解耦请求发送者和接收者,提高系统灵活性。

基本上就这些。通过封装请求为对象,命令模式让C++程序更容易扩展和维护,尤其在GUI、游戏开发或任务调度系统中非常实用。理解其结构后,可以结合函数对象或std::function进一步简化实现。

以上就是c++++如何实现命令(Command)设计模式_c++行为型设计模式实战教程的详细内容,更多请关注其它相关文章!


# 多线程  # 济南网站优化代理推荐  # 盐城网站建设服务器推荐  # 教育营销推广技巧有哪些  # seo期末测试  # 营销推广内容规范化方案  # 番禺网站建设哪里有  # 线上推广营销专业怎么样  # 邵阳企业网站优化怎么样  # 惠济本地网站推广怎么样  # 关键词优化排名sh云速捷丷  # c++  # 解决方法  # 尼克  # 怎么做  # 重写  # 适用于  # 如何实现  # 有什么  # 是一个  # 游戏开发 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html5 app怎么运行环境_配html5 app运行环境【教程】  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  《刺客信条:影》PS5 Pro和Switch 2画面对比  qq游戏免费畅玩入口_qq游戏电脑版快速启动  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  海棠账号登录入口_登录海棠账户同步阅读记录  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  Python实时数据流中的动态最值查找策略  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  cad如何更改注释性对象的比例_cad注释性比例调整方法  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  服务端验证_j*ascript输入检查  将JSON对象数组转置为键值对列表的实用指南  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  Lar*el 递归关系中排除指定分支的教程  处理嵌套交互式控件:前端可访问性指南  深入理解Go语言中的指针类型:以*string为例  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  必由学网页版入口 必由学官方平台直接访问  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  Django表单提交验证失败后保持字段值不刷新  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  C++指针和引用有什么区别_C++内存管理核心概念深度解析  Steam官网入口直达 Steam注册及登录步骤  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  J*aScript Promise链中如何正确终止后续.then执行并处理错误  利用5118提升短视频内容效果_5118短视频关键词优化方法  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  AngularJS $http POST请求数据传递与Go后端接收实践  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  内存疯狂猛猛涨价:主板销量直接腰斩!  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  AI泡沫首次被“刺破”:GPU十年都无法存活!  零跑汽车11月交付量达70327台 实现连续9个月正增长  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  Mac怎么使用表情符号_Mac Emoji快捷键面板  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析 

搜索