0

0

c++ 命令模式实现 c++如何将请求封装成对象

星降

星降

发布时间:2026-03-18 16:33:11

|

659人浏览过

|

来源于php中文网

原创

命令模式核心是将请求封装为可存储、传递、排队的Command对象,统一接口为execute()和undo(),Command持Receiver弱引用并委托执行,避免循环引用与值语义切片。

c++ 命令模式实现 c++如何将请求封装成对象

命令模式的核心:把 do_something() 变成 Command 对象

不是写个函数就完事,而是让每个请求(比如“保存文件”“撤销上一步”)都变成一个可存储、可传递、可排队的独立对象。关键在抽象出统一接口:execute() 和可选的 undo(),背后封装具体接收者(Receiver)和动作逻辑。

常见错误是直接在 Command 里写业务代码,导致无法复用或组合。正确做法是让 Command 持有对 Receiver 的弱引用(如指针或 std::shared_ptr),把执行逻辑委托出去。

  • Receiver 负责真正干活(如 Document::save()),Command 只负责“喊一声”
  • 构造 Command 时传入 Receiver 实例,避免在 execute() 里硬编码创建新对象
  • 如果命令需携带参数(如“保存为 path”),应在构造时捕获,而非通过全局变量或静态成员传入

如何避免 std::shared_ptr 循环引用导致内存泄漏

Invoker 持有 Command,而 Command 又持有 Receiver(且 Receiver 反向持有 Invoker 或 Command)时,std::shared_ptr 容易锁死生命周期。

典型场景:GUI 中按钮(Invoker)绑定一个 SaveCommand,而 SaveCommand 持有 Editor(Receiver),Editor 又通过信号槽连回按钮 —— 这时用 std::shared_ptr 就危险。

立即学习C++免费学习笔记(深入)”;

Riffo
Riffo

Riffo是一个免费的文件智能命名和管理工具

下载
  • Receiver 在 Command 中优先用裸指针(Receiver*)或 std::weak_ptr,尤其当 Receiver 生命周期不由 Command 控制时
  • 若必须用 std::shared_ptr,确保 Receiver 不反向持有任何指向 Command 或 Invoker 的 shared_ptr
  • 调试时加日志,在 ~Command()~Receiver() 里打印,确认析构顺序是否符合预期

std::function + lambda 能替代传统 Command 类吗?

能,但只适合简单、一次性、无状态的请求封装。比如 std::function<void> cmd = [&](){ doc.save(); };</void> 看起来很轻量,但很快会暴露问题。

真实项目中,命令常需序列化、撤销重做、权限检查、延迟执行、与 UI 控件联动 —— 这些都要求类型明确、可反射、可继承。lambda 是闭包类型,每个实例类型都不同,无法放进同一种容器(如 std::vector<:unique_ptr>></:unique_ptr>)。

  • std::function 快速原型可以,但上线前建议回归虚函数接口 + 具体子类
  • 若坚持用 std::function,至少包装一层基类(如 class Command { public: virtual void execute() = 0; };),再用 std::function 实现子类,保持多态性
  • lambda 捕获 this 后,容易引发悬空指针 —— 比裸指针更难排查

撤销栈(std::stack<:unique_ptr>></:unique_ptr>)为什么不能直接存 Command

因为 Command 是抽象基类,不能实例化;即使派生类可实例化,值语义会导致切片(slicing):拷贝时丢失派生类特有字段和虚函数表,execute() 调用会崩或行为异常。

另一个坑是误用 std::stack<command></command>,编译可能过(靠隐式转换),但运行时调用的是基类空实现,或者触发未定义行为。

  • 必须用智能指针:首选 std::unique_ptr<command></command>(撤销后命令通常不再需要)
  • 不要用 std::shared_ptr 存栈,除非多个地方共享同一命令实例(极少见)
  • 撤销操作后记得清空 redo 栈,并在 execute() 成功后把新命令压入 undo 栈 —— 这些逻辑不在 Command 内部,而在 Invoker 或 CommandManager 中
实际写的时候,最麻烦的从来不是怎么定义 execute(),而是 Receiver 和 Command 的所有权边界划在哪——一不留神,Command 就成了内存管理黑洞。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

0

2026.03.18

bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

2

2026.03.18

vscode 格式化
vscode 格式化

本专题整合了vscode格式化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.18

vscode设置中文教程
vscode设置中文教程

本专题整合了vscode设置中文相关内容,阅读专题下面的文章了解更多详细教程。

0

2026.03.18

vscode更新教程合集
vscode更新教程合集

本专题整合了vscode更新相关内容,阅读专题下面的文章了解更多详细教程。

2

2026.03.18

Gemini网页版零基础入门:5分钟上手Gemini聊天指南
Gemini网页版零基础入门:5分钟上手Gemini聊天指南

本专题专为零基础用户打造,5分钟快速掌握Gemini网页版核心用法。从账号登录到界面布局,详解如何发起对话、优化提示词及利用多模态功能。通过实战案例,教你高效获取信息、创作内容与分析数据。无论学习还是工作,轻松开启AI辅助新时代,让Gemini成为你的得力智能助手。

9

2026.03.18

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

8

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

22

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

170

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号