设计模式--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接口。

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

相关推荐
c238563 小时前
MySQL 基础用法(上):库表管理与数据增删改
c语言·数据库·c++·mysql
光源【时光寸寸又逢君】4 小时前
第三方平台预览我方级联监控点串流问题排查
c++·iot
键盘会跳舞4 小时前
C++:容器适配器 queue 的源码级拆解
开发语言·c++·queue
YuforiaCode5 小时前
第十六届蓝桥杯 2025 C/C++组 数列差分
c语言·c++·蓝桥杯
千里之行,始于足下sanhai5 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场5 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
Loge编程生活6 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
lilili也8 小时前
visual studio add matlab
c语言·c++
沫璃染墨8 小时前
《Qt从零入门系列(一):Qt框架初识——从发展历史到跨平台开发》
c++·qt·系统架构·gui
(Charon)9 小时前
【C++】多线程死锁:产生原因、复现与解决方法
开发语言·c++·算法