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

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

相关推荐
luj_17681 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符1 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
ttod_qzstudio1 小时前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式
思麟呀2 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
ysa0510302 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH2 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发3 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
旖-旎6 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
qeen876 小时前
〖C++〗STL简介:发展历史、六大组件与简单应用
c++·学习·stl·模板
c238567 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划