新闻中心
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使用方式如下:
int main() { Light livingRoomLight; LightOnCommand onCmd(livingRoomLight); LightOffCommand offCmd(livingRoomLight); RemoteControl remote; remote.SetCommand(std::make_unique支持撤销操作的扩展
命令模式的一个强大特性是支持撤销。只需在Command接口中增加Undo方法:
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
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 {
priva
te:
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++++如何实现命令(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对游戏性能的影响分析


2025-11-22
浏览次数:次
返回列表