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


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

命令模式是一种行为型设计模式,它将请求封装成对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式还能支持撤销操作。在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方法:

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++  # 游戏开发  # if  # 封装  # void  # 虚函数  # 纯虚函数  # 接口  # class  # public  # function  # 对象  # 是一个  # 适用于  # 是一种  # 还能  # 可以用  # 只需  # 并在  # 为例  # 使你  # 更容易 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】  Mac怎么设置登录项_Mac管理开机自启动程序【教程】  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第三方工具加密【教程】  Mac如何整理桌面文件_Mac使用堆栈功能一键整理  Python异步网络编程_aiohttp说明【指导】  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Mac如何修改Hosts文件?(本地开发与屏蔽网站)  mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】  电脑的“网络和共享中心”去哪了_Windows 11新版网络设置指南【新手】  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  如何在 Django 中修改用户密码后保持会话不丢失  Windows的便笺功能如何使用?(桌面备忘技巧)  Python异步编程高级项目教程_asyncio协程任务管理实战  Mac上的iMovie如何剪辑视频?(新手入门教程)  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践  c++ unordered_map怎么用 c++哈希表用法【教程】  Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】  Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】  Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件  如何使用Golang优化模块引入路径_Golanggo mod tidy清理与优化方法  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】  如何有效拦截拼接式恶意域名的垃圾信息  Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改  Win11怎么关闭搜索历史_Win11清除任务栏搜索记录【隐私】  ACF 教程:如何正确更新嵌套在多层 Group 字段内的子字段  Python数据挖掘进阶教程_分类回归与聚类案例解析  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  PHP 中 require() 语句返回值的用法详解  Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】  Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能  如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  如何高效识别并拦截拼接式恶意域名 spam  php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】  Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  c++协程和线程的区别 c++异步编程模型对比【核心】  手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】  如何使用Golang指针与接口结合_实现方法调用和动态类型  Win11怎么设置任务栏透明_Windows11使用工具美化任务栏  php报错怎么查看_定位PHP致命错误与警告的方法【教程】  Python如何创建带属性的XML节点  c++怎么用jemalloc c++替换默认内存分配器【性能】 

 2025-11-22

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

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

点击免费数据支持

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

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@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.