新闻中心

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

2025-12-04
浏览次数:
返回列表
命令模式将请求封装为对象,实现调用者与接收者的解耦。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方法。

Health AI健康云开放平台 Health AI健康云开放平台

专注于健康医疗垂直领域的AI技术开放平台

Health AI健康云开放平台 113 查看详情 Health AI健康云开放平台
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链中有效终止错误处理后的执行 

搜索