c++如何实现一个命令设计模式_c++将请求封装成对象


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

c++如何实现一个命令设计模式_c++将请求封装成对象

在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) {}
    void 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方法。

SuperDesign SuperDesign

开源的UI设计AI智能体

SuperDesign 216 查看详情 SuperDesign
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++将请求封装成对象的详细内容,更多请关注其它相关文章!


# 不改变  # 海淀区灯具网站建设  # 漯河优化型网站建设  # 天津app推广营销外包公司  # 晋州网站建设市场报价  # 推广seo优化热线  # 西宁网站推广团队有哪些  # 宜都宜昌网站建设外包  # 沧州任丘购物网站建设  # 西安网站建设口碑好  # 江门营销推广厂家  # 是一个  # 数据存储  # 处理器  # 如何使用  # 自定义  # 适用于  # 绑定  # 调用者  # 开灯  # 如何实现  # stream  # ios  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: J*aScript 数值去小数位处理:多种方法与实践  如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  漫蛙漫画直连入口 _ manwa官方备用入口实时检测  快手网页版官方访问 快手网页版页面在线打开  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  mysql如何管理数据库账户_mysql数据库账户管理技巧  解决CSS布局中意外顶部空白问题的教程  《美篇》取消会员自动续费方法  圆通快递官方入口不需要登录 在线查询入口快速查询  海外搜索引擎推广效果怎么样,怎么分析效果!  电脑视频号|直播|如何分享屏幕  《猎聘》筛选猎头岗位方法  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  如何用mysql实现客户反馈管理_mysql客户反馈数据库方法  在VS Code中进行数据科学和机器学习开发  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  抖音火山版如何进行提现  铁路12306官网入口 铁路12306中国铁路官网登录首页  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  雨课堂官网在线登录 网页版雨课堂登录链接  顺丰快递收费标准查询_如何查看顺丰最新收费价格  苹果自助维修计划支持哪些设备机型  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  《深林》冬季章节图文攻略  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  c++如何掌握指针的核心用法_c++指针入门到精通指南  优化Google Charts Gauge:在数据库无数据时显示默认值  VS Code源代码管理(SCM)视图的进阶使用技巧  抖音视频如何添加标题?添加标题有哪些好处?  WPS文字如何进行简繁转换  抖音团长模式怎么做?团长模式是什么意思?  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  追剧达人如何发弹幕  申通快件单号查询平台 申通包裹物流动态跟踪  《单词速记宝》设置学习计划方法  支付宝登录刷脸不是本人如何解决  如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  苹果手机聊天记录删除了如何恢复  Go语言中方法接收器的选择:值类型还是指针类型?  电脑开不了机怎么办 电脑无法开机的解决方法  风神瞳获取全攻略  以下哪一项是古代兵书三十六计中的计谋  在Dash应用中自定义HTML标题和网站图标  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】 

 2025-12-04

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

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

点击免费数据支持

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

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

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