C++如何实现命令设计模式?C++请求封装与撤销功能实现【设计模式】


命令模式在C++中通过将请求封装为Command接口对象实现解耦,支持参数化、排队、日志与撤销;Invoker调用execute()/undo()而不依赖Receiver细节,Receiver仅执行具体逻辑,命令对象应轻量、无状态或仅存必要上下文,撤销需缓存状态并用智能指针管理生命周期。

c++如何实现命令设计模式?c++请求封装与撤销功能实现【设计模式】

命令模式在C++中核心是把“请求”封装成对象,从而支持参数化、排队、日志、撤销等操作。关键在于定义统一的命令接口,让调用者(Invoker)不依赖具体操作细节,而接收者(Receiver)只负责执行实际逻辑。

命令接口与具体命令类

定义抽象基类 Command,声明虚函数 execute() 和可选的 undo();每个具体操作(如打开文件、保存、撤回)派生一个命令类,内部持有对 Receiver 的引用或所需数据。

  • Receiver 不直接被 Invoker 调用,而是由 Command 在 execute() 中调用其方法
  • 命令对象应尽量无状态,或仅保存执行必需的最小上下文(如文件名、旧文本、坐标)
  • 若需撤销,undo() 必须能恢复到 execute 前的状态,通常需在 execute 中缓存关键信息

支持撤销的命令栈管理

用 std::stack<:unique_ptr>> 管理已执行命令,每次 execute 后压入栈;调用 undo 时弹出栈顶并调用其 undo()。注意:不是所有命令都支持撤销(如“退出程序”),可加 isUndoable() 接口或用空实现。

  • 撤销后通常需禁用重做(Redo),若需支持,可额外维护一个 redo 栈,在 undo 时把命令移入 redo 栈
  • 避免裸指针,用智能指针管理命令生命周期,防止内存泄漏
  • 命令对象一般是一次性使用的,执行/撤销后可析构,无需复用

调用者(Invoker)解耦设计

Invoker 持有 Command* 或 std::function,但更推荐持有 Command 接口指针(或 std::unique_ptr),通过 setCommand() 注入不同命令。它不关心命令做什么,只负责触发 execute() 或 undo()。

Moshi Chat Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

Moshi Chat 165 查看详情 Moshi Chat
  • 可扩展为支持宏命令(MacroCommand):聚合多个子命令,统一 execute/undo
  • 菜单项、快捷键、按钮等 UI 元素均可作为 Invoker,绑定不同命令实例
  • Invoker 可记录命令执行时间、失败重试策略,或转发给日志模块

一个简明示例:文本编辑器的撤销操作

假设 Receiver 是 TextDocument,有 insert(text) 和 deleteLast() 方法。命令类 InsertCommand 在构造时保存待插入文本,在 execute() 中调用 insert(),在 undo() 中调用 deleteLast()(前提是知道删多少字符——所以它还需缓存 length)。

  • 构造 InsertCommand(doc, "hello") → 缓存 doc 和 "hello" 长度 5
  • execute() → doc.insert("hello")
  • undo() → doc.deleteLast(5)
  • Invoker(如 Editor 类)持有一个 std::stack,每次成功 execute 后 push(std::move(cmd))

基本上就这些。命令模式在 C++ 中不复杂,但容易忽略内存管理和撤销状态一致性。只要接口清晰、职责分明,就能自然支持请求队列、事务回滚和用户级撤销功能。

以上就是C++如何实现命令设计模式?C++请求封装与撤销功能实现【设计模式】的详细内容,更多请关注其它相关文章!


# 是由  # 朔州网络营销推广价格表  # 大良交通设备网站建设  # 合肥网站建设 388元  # 长沙seo交流  # 进行 网站推广  # 贵阳网站建设效果  # 南昌seo优化推广  # 长沙高效网站建设团队  # 网站快照优化去哪家  # 江苏互联网营销推广价格  # 做什么  # mac  # 还能  # 调用者  # 多个  # 就能  # 若需  # 具体操作  # 如何用  # 如何实现  # red  # c++  # 栈 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  C++二维数组动态分配方法_C++指针与数组内存布局  百度网盘如何设置上传限额  J*a列表元素格式化输出教程  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  阿里云共享相册入口在哪  126邮箱申请入口官网_126邮箱注册免费登录2025  《爱南宁》认证电动车方法  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  HTML中多图片上传与预览:解决ID冲突的专业指南  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  《友玩*》创建群聊方法  《幻兽帕鲁》手游帕鲁捕捉技巧分享  哈尔滨城市通昵称修改方法  5G和6G的连接密度有什么区别 6G每平方公里能连接多少设备  QQ网站入口直接登录 QQ官方正版登录页面  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  J*aScript 数值去小数位处理:多种方法与实践  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  qq邮箱格式填写示例 qq邮箱标准填写规范  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  J*aScript类型数组_TypedArray使用  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  深入理解Python对象引用与链表属性赋值  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  c++如何使用std::thread::join和detach_c++线程生命周期管理  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧  个人所得税办理入口 个人所得税综合所得年度汇算入口  虫虫助手如何更新游戏  在VS Code中进行数据科学和机器学习开发  构建可配置的J*aScript加权点击计数器与共享总计功能  批改网官网首页登录 批改网学生用户登录入口  2025考研成绩查询时间入口分享  《花瓣》创建专辑方法  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  包子漫画在线观看入口 包子漫画网正版全集链接  使用jQuery精确检测除指定元素外任意位置的点击事件  背部总是隐隐作痛怎么回事 背痛如何改善  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  4399小游戏下装链接 4399小游戏下载链接入口  中大网校app做题记录清除方法  天堂漫画网页版在线阅读 天堂漫画手机版入口  苹果手机怎么合并照片_苹果手机合并多张照片的操作方法 

 2025-12-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.