c++怎么实现一个命令(Command)设计模式_c++命令模式(Command Pattern)实现


命令模式将操作封装为对象,实现请求与执行解耦。示例中通过Command接口、具体命令(如开灯、关灯)、接收者(灯)和调用者(遥控器)协作完成控制,支持扩展撤销、宏命令等功能,提升灵活性。

c++怎么实现一个命令(command)设计模式_c++命令模式(command pattern)实现

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。在 C++ 中实现命令模式的关键是把“操作”变成一个可传递的对象,这样调用者不需要知道具体执行什么操作。

基本结构说明

命令模式通常包含以下几个角色:

  • Command(命令接口):声明执行操作的接口。
  • ConcreteCommand(具体命令):实现 Command 接口,持有对接收者的引用,并定义如何调用接收者的动作。
  • Receiver(接收者):真正执行请求功能的类。
  • Invoker(调用者):请求被委托给命令对象执行。
  • Client(客户端):创建具体命令并绑定接收者。

简单代码实现

下面是一个简单的 C++ 示例,演示如何使用命令模式实现“开灯”和“关灯”操作。

#include <iostream>
#include <memory>

// 接收者:灯
class Light {
public:
    void turnOn() {
        std::cout << "灯打开了。\n";
    }

    void turnOff() {
        std::cout << "灯关闭了。\n";
    }
};

// 命令接口
class Command {
public:
    virtual ~Command() = default;
    virtual void execute() = 0;
};

// 具体命令:开灯
class LightOnCommand : public Command {
private:
    Light& light;
public:
    LightOnCommand(Light& l) : light(l) {}

    void execute() override {
        light.turnOn();
    }
};

// 具体命令:关灯
class LightOffCommand : public Command {
private:
    Light& light;
public:
    LightOffCommand(Light& l) : light(l) {}

    void execute() override {
        light.turnOff();
    }
};

// 调用者:遥控器
class RemoteControl {
private:
    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 onCommand = std::make_unique<LightOnCommand>(livingRoomLight);
    auto offCommand = std::make_unique<LightOffCommand>(livingRoomLight);

    RemoteControl remote; // 调用者

    // 执行开灯
    remote.setCommand(std::move(onCommand));
    remote.pressButton();

    // 执行关灯
    remote.setCommand(std::make_unique<LightOffCommand>(livingRoomLight));
    remote.pressButton();

    return 0;
}

输出结果:

AiTxt 文案助手 AiTxt 文案助手

AiTxt 利用 Ai 帮助你生成您想要的一切文案,提升你的工作效率。

AiTxt 文案助手 105 查看详情 AiTxt 文案助手 灯打开了。
灯关闭了。

扩展与优化思路

命令模式的优势在于解耦和扩展性。你可以轻松添加新命令而无需修改调用者代码。

  • 支持撤销操作:在 Command 接口中增加 undo() 方法。
  • 支持宏命令(组合命令):实现一个 MacroCommand 包含多个子命令。
  • 命令入队:将命令对象放入队列,实现异步处理或日志记录。
  • 支持回调:使用 std::function 封装更灵活的操作,替代抽象基类。

例如,使用函数对象简化命令定义:

class FunctionCommand : public Command {
    std::function<void()> action;
public:
    FunctionCommand(std::function<void()> act) : action(std::move(act)) {}
    
    void execute() override {
        action();
    }
};

然后可以直接传入 lambda 或函数:

remote.setCommand(std::make_unique([&]() { std::cout

基本上就这些。命令模式的核心思想是“把操作当作一等公民”,让程序更具弹性。C++ 中通过多态或函数包装都能很好地实现这一模式。

以上就是c++++怎么实现一个命令(Command)设计模式_c++命令模式(Command Pattern)实现的详细内容,更多请关注其它相关文章!


# 很好  # 全南县网站推广平台官网  # seo软件排行榜+s  # 莞城seo优化外包  # 和平网站优化公司  # 福建省b2b营销推广  # 徐州关键词排名方法  # 亚马逊seo 提升排名  # 珠海百度seo推广机构  # 惠州狼雨 seo  # 网站seo需要做什么  # 打开了  # 是一种  # mac  # 这一  # 几个  # 是一个  # 如何用  # 多态  # 调用者  # 开灯  # stream  # ios  # c++  # ai 


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


相关推荐: win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  《荔枝fm》导出文件教程  j*a中赋值运算符是什么?  PHP安全加载非公开目录图片与动态内容类型处理指南  创客贴登录页面入口 创客贴网页版最新网址链接  mysql中外键约束如何使用_mysql FOREIGN KEY操作  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  微博网页版入口链接 微博网页版在线互动平台  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  店铺如何做视频号推广?做视频号推广有用吗?  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  网页版网易云音乐入口_网易云音乐在线官网登录  J*aScript事件处理:优化键盘输入与表单提交的实践指南  《虎扑》取消评分记录方法  PHP动态导航按钮:根据用户登录状态切换链接与文本  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  处理含命名空间的XML文件 Power Query中的高级技巧  VS Code的时间线(Timeline)视图:您的代码时光机  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  《随手记》启用语音备注方法  C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析  在React中正确处理HTML input type="number"的数值类型  繁花漫画使用教程  《鹿路通》退余额方法  GBA模拟器手柄按键设置  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  J*aScript:从子元素中批量移除特定CSS类  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  iphone16系列配置参数介绍  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  汽水音乐网页端访问 汽水音乐官方网页直达  基于键值条件高效映射 Pandas DataFrame 多列数据  铁拳8在线玩 铁拳8在线秒玩入口  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  msn官方入口2025登录 msn官网2025直达首页入口  《淘宝联盟》推广自己的店铺方法  c++类和对象到底是什么_c++面向对象编程基础  大众点评了却看不到是怎么回事  《跳跳舞蹈》循环播放方法  《百度畅听版》关闭兴趣推荐方法  《领英》查看屏蔽名单方法 

 2025-10-28

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

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

点击免费数据支持

提交您的需求,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.