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


相关推荐: 《异星探险家》古怪的物品作用介绍  《随手记》启用语音备注方法  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  Yandex世界探索 最新官方免登录入口全知道  Lar*el Socialite单设备登录策略:实现用户唯一会话管理  使用VS Code调试Python代码:从入门到精通  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  优化长HTML属性值:SonarQube警告与实用策略  猫眼app抢票快还是小程序快  批改网官网首页登录 批改网学生用户登录入口  多多买菜门店端app订单查看方法  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  《小黑盒》删除历史浏览方法  J*aScript对象中深度嵌套URL键的查找与更新策略  WooCommerce 购物车:始终显示所有交叉销售商品  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  Git命令与VS Code UI操作的对应关系解析  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  优化Flask模板中SQLAlchemy查询迭代标签:处理字符串空格问题  如何在mysql中使用索引提示_mysql索引提示优化方法  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  在Django单元测试中优雅处理信号:基于环境的条件执行策略  如何取消数字签名  PHP动态导航按钮:根据用户登录状态切换链接与文本  PHP utf8_encode 字符编码转换陷阱与解决方案  Flash AS3.0简易相册制作  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  创建您的便携版VS Code:让配置随身携带  iPhone12是否要更新ios16  《健康大兴》注册方法介绍  《tt语音》超级玩家开通方法  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  《下一站江湖2》大雪山加入方法  重返未来:1999卡戎全方位攻略  在Django中动态检查模型关联:一种灵活的解决方案  偃武诸葛亮阵容搭配推荐  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  海棠阅读网页版_进入海棠网页版在线阅读中心  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  qq邮箱格式填写示例 qq邮箱标准填写规范  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  性能与资源监视器快捷打开  不吃碳水化合物是健康减肥的好办法吗  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  b站网页版入口 哔哩哔哩官方网站直接进入  动漫岛汉化官网网 动漫岛官方动漫汉化地址  iPhone14开启Apple TV遥控设置 

 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.