命令模式将请求封装为对象,便于参数化、队列化和撤销操作;其核心由Command、ConcreteCommand、Receiver、Invoker和Client组成;以C++实现电灯开关为例,通过解耦发送者与接收者,支持扩展与维护,适用于GUI、游戏及任务调度系统。
命令模式是一种行为型设计模式,它将请求封装成对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式还能支持撤销操作。在C++中,这种模式特别适用于需要解耦请求发送者和接收者的场景。
命令模式包含四个基本组成部分:
下面是一个简单的C++
实现,模拟电灯的开关控制:
使用方式如下:
int main() { Light livingRoomLight; LightOnCommand onCmd(livingRoomLight); LightOffCommand offCmd(livingRoomLight); RemoteControl remote; remote.SetCommand(std::make_unique命令模式的一个强大特性是支持撤销。只需在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命令模式适合以下情况:
基本上就这些。通过封装请求为对象,命令模式让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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。