【设计模式之命令模式 -- C++】

命令模式 -- 请求封装,解耦合

命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象,从而允许用户使用不同的请求、队列请求、记录请求日志、撤销操作等功能。这种模式背后的主要思想是提供将客户端请求解耦从接收者的机制。

组成

命令模式通常涉及以下几个角色:

  1. 命令(Command):定义执行操作的接口。
  2. 具体命令(ConcreteCommand):实现命令接口,定义了它必须调用的接收者的动作。
  3. 调用者(Invoker):请求命令执行某些操作。
  4. 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
  5. 客户端(Client):创建一个具体命令对象并设置其接收者。
优势
  1. 解耦调用者和接收者:命令模式使得调用者和接收者之间不直接交互,而是通过命令对象进行交互,增加了系统的灵活性。
  2. 扩展性:可以很容易地添加新的命令类,无需修改现有的代码,这符合开闭原则。
  3. 组合命令:可以将多个命令组合成宏命令,即复合命令。
  4. 支持撤销操作:命令模式可以通过实现一个撤销操作的方法来支持撤销功能。
  5. 支持日志记录:可以通过命令模式记录和存储命令的历史,以便后续可以重新执行这些命令,这在需要持久化操作或事务的系统中非常有用。
使用场景
  1. 图形用户界面(GUI):在GUI中,用户的各种操作(如按钮点击、菜单选择)可以通过命令模式来实现,使得操作的撤销、重做变得可行。
  2. 事务系统:在需要支持事务的系统中,命令模式可以用来实现事务的逻辑,其中每个命令代表一个操作,支持撤销(rollback)和重做(redo)操作。
  3. 批处理操作:当需要执行一系列操作或者需要将操作排队执行时,命令模式提供了一种有效的管理和调度命令的方式。
  4. 日志操作:在需要记录操作历史以便后续可以重新执行这些操作的系统中,命令模式可以用来实现操作的记录、存储和重放。
  5. 智能家居控制系统:在智能家居或者类似的系统中,命令模式可以用来封装各种设备的操作,如开灯、关灯、调节温度等,提供一种统一的操作接口。
实现
  1. 命令(Command):定义执行操作的接口。
cpp 复制代码
class Command {
public:
    virtual ~Command() {}
    virtual void execute() = 0;
};
  1. 具体命令(ConcreteCommand):实现命令接口,定义了它必须调用的接收者的动作。
cpp 复制代码
class LightOnCommand : public Command {
private:
    Light& light;

public:
    LightOnCommand(Light& light) : light(light) {}

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

class LightOffCommand : public Command {
private:
    Light& light;

public:
    LightOffCommand(Light& light) : light(light) {}

    void execute() override {
        light.turnOff();
    }
};
  1. 调用者(Invoker):请求命令执行某些操作。
cpp 复制代码
class RemoteControl {
private:
    std::unique_ptr<Command> onCommand;
    std::unique_ptr<Command> offCommand;

public:
    void setCommand(std::unique_ptr<Command> onCommand, std::unique_ptr<Command> offCommand) {
        this->onCommand = std::move(onCommand);
        this->offCommand = std::move(offCommand);
    }

    void pressOnButton() {
        onCommand->execute();
    }

    void pressOffButton() {
        offCommand->execute();
    }
};
  1. 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
cpp 复制代码
class Light {
public:
    void turnOn() {
        std::cout << "Light is On\n";
    }

    void turnOff() {
        std::cout << "Light is Off\n";
    }
};
  1. 客户端(Client):创建一个具体命令对象并设置其接收者。
cpp 复制代码
int main() {
    Light light;
    RemoteControl remote;

    remote.setCommand(std::make_unique<LightOnCommand>(light), std::make_unique<LightOffCommand>(light));
    remote.pressOnButton();
    remote.pressOffButton();

    return 0;
}
  1. 结果
shell 复制代码
Light is On
Light is Off
相关推荐
神仙别闹5 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员5 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
xiaofeiyang1506 小时前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
qq_199886878 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
汉克老师10 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者10 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
天若有情67310 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_1998868710 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao173383710 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
shada12 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++