设计模式--Command模式

命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式主要包含以下几个角色:

  1. Command(抽象命令类):声明执行操作的接口。
  2. ConcreteCommand(具体命令类):是一个具体的命令,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
  3. Invoker(调用者):要求该命令执行这个请求。
  4. Receiver(接收者):知道如何实施与执行一个请求相关的操作。

命令模式的主要优点是:

  • 降低系统的耦合度。
  • 新的命令可以很容易地加入到系统中。
    命令模式适用于以下场景:
  • 支持撤销的操作。
  • 支持修改、排队或者追踪请求。
  • 如果一个请求的接收者不明确,或者一个请求需要被多个对象处理。
  • 用于处理一系列请求,可以进行批处理。

以下是一个简单的C++实现的命令模式(Command Pattern)示例:

复制代码
#include <iostream>

// 抽象命令类
class Command {
public:
    virtual void execute() = 0;
    virtual ~Command() {}
};

// 接收者类
class Receiver {
public:
    void action() {
        std::cout << "Receiver action..." << std::endl;
    }
};

// 具体命令类
class ConcreteCommand : public Command {
public:
    ConcreteCommand(Receiver* receiver) : receiver_(receiver) {}
    void execute() override {
        receiver_->action();
    }

private:
    Receiver* receiver_;
};

// 调用者类
class Invoker {
public:
    Invoker(Command* command) : command_(command) {}
    void call() {
        command_->execute();
    }

private:
    Command* command_;
};

int main() {
    Receiver* receiver = new Receiver();
    Command* command = new ConcreteCommand(receiver);
    Invoker* invoker = new Invoker(command);

    invoker->call();

    delete invoker;
    delete command;
    delete receiver;

    return 0;
}

在这个例子中,Command是抽象命令类,定义了一个execute接口。ConcreteCommand是具体命令类,实现了execute接口。

Receiver是接收者类,它知道如何实施和执行一个请求相关的操作。在ConcreteCommand的execute接口中,调用了Receiver的action接口。

Invoker是调用者类,它要求命令执行一个请求,也就是调用命令的execute接口。

通过这种方式,我们可以将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

相关推荐
Trouvaille ~2 分钟前
【C++篇】让错误被温柔对待(下):异常高级特性与最佳实践
运维·开发语言·c++·异常·raii·编程实践·基础入门
小无名呀13 分钟前
使用C语言连接MySQL
数据库·c++·mysql
雾岛听蓝25 分钟前
C++ string 类解析
开发语言·c++
子枫秋月26 分钟前
模拟C++string实现
数据结构·c++·算法
oioihoii27 分钟前
C++内存安全方案前沿研究
c++·安全·mfc
十五年专注C++开发29 分钟前
QProcess在Windows下不能正常启动exe的原因分析
开发语言·c++·windows·qprocess·createprocess
无限进步_30 分钟前
C++多态全面解析:从概念到实现
开发语言·jvm·c++·ide·git·github·visual studio
无限进步_31 分钟前
C++ STL容器适配器深度解析:stack、queue与priority_queue
开发语言·c++·ide·windows·算法·github·visual studio
CoderCodingNo42 分钟前
【GESP】C++五级真题(前缀和思想考点) luogu-P10719 [GESP202406 五级] 黑白格
开发语言·c++·算法
小毅&Nora42 分钟前
【后端】【C++】协程深度解析:从内部机制到实用场景
c++·协程