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

发布于:2024-06-29 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

命令模式(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):定义执行操作的接口。
class Command {
public:
    virtual ~Command() {}
    virtual void execute() = 0;
};
  1. 具体命令(ConcreteCommand):实现命令接口,定义了它必须调用的接收者的动作。
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):请求命令执行某些操作。
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):知道如何实施与执行一个请求相关的操作。
class Light {
public:
    void turnOn() {
        std::cout << "Light is On\n";
    }

    void turnOff() {
        std::cout << "Light is Off\n";
    }
};
  1. 客户端(Client):创建一个具体命令对象并设置其接收者。
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. 结果
Light is On
Light is Off

网站公告

今日签到

点亮在社区的每一天
去签到