【设计模式】命令模式

什么是命令模式

命令模式是一种行为型设计模式。

它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

例如你正在开发一款新的文字编辑器, 包含多个按钮的工具栏, 每个按钮对应编辑器的不同操作。 你创建了一个非常简洁的 按钮类, 可用于生成工具栏上的按钮, 还可用于生成各种对话框的通用按钮。

代码示例

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

  1. Command(命令接口):声明执行操作的接口。
  2. ConcreteCommand(具体命令):将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
  3. Invoker(调用者):要求该命令执行这个请求。
  4. Receiver(接收者):知道如何执行一个与请求相关的操作,它执行任何具体命令。
cpp 复制代码
#include <iostream>
#include <memory>
#include <vector>

// Receiver 类
class Light {
public:
    void on() {
        std::cout << "The light is on" << std::endl;
    }

    void off() {
        std::cout << "The light is off" << std::endl;
    }
};

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

// ConcreteCommand 类
class LightOnCommand : public Command {
public:
    explicit LightOnCommand(Light* light) : light_(light) {}

    void execute() override {
        light_->on();
    }

private:
    Light* light_;
};

class LightOffCommand : public Command {
public:
    explicit LightOffCommand(Light* light) : light_(light) {}

    void execute() override {
        light_->off();
    }

private:
    Light* light_;
};

// Invoker 类
class RemoteControl {
public:
    void setCommand(std::unique_ptr<Command> command) {
        command_ = std::move(command);
    }

    void pressButton() {
        if (command_) {
            command_->execute();
        }
    }

private:
    std::unique_ptr<Command> command_;
};

int main() {
    Light light;

    RemoteControl remote;
    remote.setCommand(std::make_unique<LightOnCommand>(&light));
    remote.pressButton(); // 输出: The light is on

    remote.setCommand(std::make_unique<LightOffCommand>(&light));
    remote.pressButton(); // 输出: The light is off

    return 0;
}

主要优点

• 解耦请求发送者和接收者:发送者和接收者之间的耦合被降低。

• 支持队列和日志记录:可以很容易地实现命令队列和日志记录功能。

• 易于扩展:新增加一个命令只需要添加一个新的命令类。

• 支持撤销操作:可以轻松实现命令的撤销和重做。

相关推荐
YA33315 小时前
java设计模式六、装饰器模式
java·设计模式·装饰器模式
半夏知半秋19 小时前
游戏登录方案中常见的设计模式整理
服务器·开发语言·笔记·学习·游戏·设计模式·lua
Asort1 天前
JavaScript设计模式(十八)——备忘录模式:状态保存与恢复的艺术
前端·javascript·设计模式
原来是好奇心1 天前
告别if-else!使用策略模式优雅处理多种MQTT消息类型
java·mqtt·设计模式·策略模式·emqx
AY呀1 天前
# 从 HTML5 敲击乐到前端工程化:模块化开发如何重塑交互体验
设计模式
天南星1 天前
23种设计模式-深度讲解-7. 装饰器模式 (Decorator)
后端·设计模式
hans汉斯1 天前
【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
大数据·数据库·人工智能·设计模式·机器人·边缘计算·论文笔记
杯莫停丶1 天前
设计模式之:适配器模式
设计模式·适配器模式
xiezhr1 天前
见过哪些醍醐灌顶的Java代码:从"卧槽"到"原来如此"的顿悟
java·后端·设计模式
WaWaJie_Ngen1 天前
【设计模式】适配器模式(Adapter)
设计模式·适配器模式