新闻中心
c++如何实现一个命令设计模式_c++将请求封装成对象
命令模式将请求封装为对象,实现调用者与接收者的解耦。1. Command接口定义execute方法;2. ConcreteCommand实现具体操作并绑定Receiver;3. Receiver执行实际动作;4. Invoker通过调用命令的execute发起请求;5. Client创建命令并绑定接收者。示例中遥控器(Invoker)通过LightOnCommand和LightOffCommand控制电灯(Receiver)的开关,支持扩展undo方法实现撤销功能,适用于GUI、任务调度等需参数化操作的场景。

在C++中,命令模式(Command Pattern)是一种行为设计模式,它将“请求”封装成对象,从而使你可以用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
核心思想是:把一个操作(比如打开灯、保存文件)变成一个对象(命令对象),这个对象知道接收者和要执行的动作,并能执行该动作。调用者不需要知道具体执行细节,只需要调用命令的execute方法即可。
基本结构
命令模式通常包含以下几个角色:
- Command(命令接口):声明执行操作的接口,比如execute()
- ConcreteCommand(具体命令):实现Command接口,持有对“接收者”的引用,并在execute中调用接收者的相应方法
- Receiver(接收者):真正执行请求操作的对象,比如灯、文件处理器等
- Invoker(调用者):持有命令对象,通过调用命令的execute来发起请求
- Client(客户端):创建命令对象并绑定其接收者
代码示例
以下是一个简单的例子:用命令模式控制电灯的开关。
#include <iostream>
#include <memory>
// 接收者:电灯
class Light {
public:
void on() {
std::cout << "Light is ON\n";
}
void off() {
std::cout << "Light is OFF\n";
}
};
// 命令接口
class Command {
public:
virtual ~Command() = default;
virtual void execute() = 0;
};
// 具体命令:开灯
class LightOnCommand : public Command {
Light& light;
public:
explicit LightOnCommand(Light& l) : light(l) {}
vo
id execute() override {
light.on();
}
};
// 具体命令:关灯
class LightOffCommand : public Command {
Light& light;
public:
explicit LightOffCommand(Light& l) : light(l) {}
void execute() override {
light.off();
}
};
// 调用者:遥控器
class RemoteControl {
std::unique_ptr<Command> command;
public:
void setCommand(std::unique_ptr<Command> cmd) {
command = std::move(cmd);
}
void pressButton() {
if (command) {
command->execute();
}
}
};
使用方式
在main函数中组装对象并运行:
int main() {
Light livingRoomLight;
// 创建具体命令
auto onCmd = std::make_unique<LightOnCommand>(livingRoomLight);
auto offCmd = std::make_unique<LightOffCommand>(livingRoomLight);
RemoteControl remote;
// 设置并执行开灯命令
remote.setCommand(std::move(onCmd));
remote.pressButton();
// 设置并执行关灯命令
remote.setCommand(std::move(offCmd));
remote.pressButton();
return 0;
}
扩展功能:支持撤销
命令模式很容易支持撤销操作。只需在Command接口中添加undo方法。
Health AI健康云开放平台
专注于健康医疗垂直领域的AI技术开放平台
113
查看详情
class Command {
public:
virtual ~Command() = default;
virtual void execute() = 0;
virtual void undo() = 0; // 新增撤销
};
// 修改 LightOnCommand 支持撤销
class LightOnCommand : public Command {
Light& light;
public:
explicit LightOnCommand(Light& l) : light(l) {}
void execute() override {
light.on();
}
void undo() override {
light.off();
}
};
// 类似地,LightOffCommand 的 undo 是开灯
void undo() override {
light.on();
}
RemoteControl 可以记录上一个命令,在用户按下“撤销”时调用undo。
优点与适用场景
命令模式的优势包括:
- 解耦调用者与接收者
- 支持命令队列、宏命令(组合多个命令)、延迟执行
- 实现撤销/重做非常方便
- 可以用于实现事务性操作
适用于需要将操作参数化、记录操作日志、支持撤销机制的系统,如GUI按钮、菜单项、任务调度等。
基本上就这些。通过将请求封装为对象,C++中的命令模式提升了系统的灵活性和扩展性。
以上就是c++++如何实现一个命令设计模式_c++将请求封装成对象的详细内容,更多请关注其它相关文章!
# 是一个
# seo软件是什么
# 私密微整形如何营销推广
# 新加坡大学内部网站建设
# 鼓楼网站建设推进会
# 东莞网站建设指南公示
# 宝安网站建设报价
# 日照网站建设和推广怎样
# 脐橙线下营销推广策略
# 宁波视频网站优化方案
# 指定关键词跳转seo
# 链表
# 面试题
# 处理器
# 管理规则
# 什么用
# 适用于
# 绑定
# 调用者
# 开灯
# 如何实现
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
PostgreSQL海量数据高效导入策略:Python与Django实践指南
知音漫客官网漫画下载_知音漫客网页版阅读记录
4399免费游戏网址入口 4399小游戏免费入口点开即玩
Log4j Console Appender性能瓶颈与高并发优化策略
学习通网页版快速入口 学习通官网网页版直接打开
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
AngularJS $http POST请求数据传递与Go后端接收实践
京东单号查询入口_京东快递订单追踪入口
微信客户端如何收红包_微信客户端接收红包使用教程
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
解决Flask中Quill编辑器内容提交失败及TypeError的指南
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
58动漫网在线官方网 58动漫网正版动漫入口网址
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
J*aScript中在Map循环中检测并处理空数组元素
将HTML动态表格多行数据保存到Google Sheet的教程
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
mc.js免安装版 mc.js一键畅玩入口
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
CSS图片焦点样式实现教程:理解与应用tabindex属性
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
在Runstone环境中高效处理TasteDive API的JSON数据
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
Golang如何优雅处理error_Golang error处理最佳实践总结
必由学登录入口 必由学官方网站在线访问链接
《主播少女的秘密账号迷宫》首支宣传片
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
PHP URL参数传递与500错误调试指南
优化大型XML文件解析:基于Python流式处理的内存高效方案
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
极兔快递快件信息查询系统 极兔快递官网运单号追踪
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
照顾宝贝2小游戏点击立即在线玩
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
汽车之家官方网站官网入口_汽车之家网页版直接进入
在Pyomo中实现基于变量的条件约束:Big-M方法详解
Python多版本共存与虚拟环境管理深度指南
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
Python字典中优雅地迭代剩余元素的方法
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
Lar*el 8 多关键词数据库搜索优化实践
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
如何在Promise链中有效终止错误处理后的执行


2025-12-04
浏览次数:次
返回列表
id execute() override {
light.on();
}
};
// 具体命令:关灯
class LightOffCommand : public Command {
Light& light;
public:
explicit LightOffCommand(Light& l) : light(l) {}
void execute() override {
light.off();
}
};
// 调用者:遥控器
class RemoteControl {
std::unique_ptr<Command> command;
public:
void setCommand(std::unique_ptr<Command> cmd) {
command = std::move(cmd);
}
void pressButton() {
if (command) {
command->execute();
}
}
};