【设计模式之命令模式 -- 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
相关推荐
渣渣_Maxz17 小时前
使用 antlr 打造 Android 动态逻辑判断能力
android·设计模式
知然19 小时前
鸿蒙 Native API 的封装库 h2lib_arkbinder
c++·arkts·鸿蒙
十五年专注C++开发19 小时前
Qt .pro配置gcc相关命令(三):-W1、-L、-rpath和-rpath-link
linux·运维·c++·qt·cmake·跨平台编译
码农颜20 小时前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
Cai junhao20 小时前
【Qt】Qt控件
开发语言·c++·笔记·qt
uyeonashi20 小时前
【QT系统相关】QT网络
开发语言·网络·c++·qt
我命由我1234521 小时前
嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
筏.k1 天前
C++: 类 Class 的基础用法
android·java·c++
C++ 老炮儿的技术栈1 天前
手动实现strcpy
c语言·开发语言·c++·算法·visual studio
一条叫做nemo的鱼1 天前
从汇编的角度揭开C++ this指针的神秘面纱(下)
java·汇编·c++·函数调用·参数传递