设计模式:命令模式(C++实现)

命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求对客户端进行参数化。这使得客户端可以独立于具体的请求和接收者对请求进行操作。

以下是一个简单的C++命令模式的示例:

cpp 复制代码
#include <iostream>
#include <vector>

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

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

    void play()
    {
        std::cout << "Receiver is playing." << std::endl;
    }
};

// 具体命令类
class ConcreteCommand : public Command
{
private:
    // 接收者对象
    Receiver *receiver;

public:
    ConcreteCommand(Receiver *receiver)
    {
        this->receiver = receiver;
    }
    void execute() override
    {
        receiver->action();
    }
};

// 具体命令类
class PlayCommand : public Command
{
private:
    // 接收者对象
    Receiver *receiver;

public:
    PlayCommand(Receiver *receiver)
    {
        this->receiver = receiver;
    }
    void execute() override
    {
        receiver->play();
    }
};

// 调用者类
class Invoker
{
private:
    std::vector<Command *> commands;

public:
    void addCommand(Command *command)
    {
        commands.push_back(command);
    }
    
    void executeCommands()
    {
        for (auto command : commands)
        {
            command->execute();
        }
        commands.clear();
    }
};

int main()
{
    Invoker invoker;
    Receiver receiver;

    Command *command = new ConcreteCommand(&receiver);
    invoker.addCommand(command);
    invoker.executeCommands(); // 调用命令对象的execute()函数

    command = new PlayCommand(&receiver);
    invoker.addCommand(command);
    invoker.executeCommands(); // 调用命令对象的execute()函数
    return 0;
}

在上述示例中,Command是命令的基类,定义了一个纯虚函数execute(),用于执行命令。ConcreteCommand是具体的命令类,它包含了一个指向接收者对象的指针,并实现了execute()函数,将请求委托给接收者的action()函数进行处理。

Receiver是接收者类,它定义了真正执行请求的操作,即action()函数。

Invoker是调用者类,它维护一个命令对象的列表,并提供了addCommand()和executeCommands()函数。addCommand()用于向命令列表中添加命令对象,executeCommands()用于执行命令列表中的所有命令。

在main()函数中,创建了一个调用者对象invoker和一个接收者对象receiver。然后创建了一个具体的命令对象command,并将其添加到调用者的命令列表中。通过调用executeCommands()函数,调用者会依次执行命令列表中的命令。

通过命令模式,客户端可以将请求封装成命令对象,从而将请求发送者和请求接收者解耦。这样,可以灵活地组合和操作不同的请求。命令模式还支持撤销、重做等功能的实现。

相关推荐
智者知已应修善业5 分钟前
【数字稳压控制DAC/TLC5615驱动】2023-5-27
c++·经验分享·笔记·算法·51单片机
t***5447 分钟前
Orwell Dev-C++和Embarcadero Dev-C++哪个更稳定
开发语言·c++
代码中介商29 分钟前
C++运行时多态深度解析:从原理到实践
开发语言·c++·多态·虚函数
代码中介商1 小时前
C++ 继承与派生深度解析:存储布局、构造析构与高级特性
开发语言·c++·继承·派生
谭欣辰1 小时前
C++ 控制台跑酷小游戏2.0
开发语言·c++·游戏程序
Wild_Pointer.1 小时前
C++:内存顺序(Memory Order)的概念以及使用
c++
并不喜欢吃鱼1 小时前
从零开始C++----七.继承相关模型,解析多继承与菱形继承问题(下篇)
开发语言·c++
进击的荆棘2 小时前
递归、搜索与回溯——二叉树中的深搜
数据结构·c++·算法·leetcode·深度优先·dfs
进击的荆棘2 小时前
递归、搜索与回溯——回溯
数据结构·c++·算法·leetcode·dfs
郝学胜-神的一滴2 小时前
[简化版 Games 101] 计算机图形学 05:二维变换下
c++·unity·图形渲染·three.js·opengl·unreal