设计模式:命令模式(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()函数,调用者会依次执行命令列表中的命令。

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

相关推荐
Morwit13 小时前
【力扣hot100】64. 最小路径和
c++·算法·leetcode
OliverH-yishuihan13 小时前
开发linux项目-在 Windows 上 基于“适用于 Linux 的 Windows 子系统(WSL)”
linux·c++·windows
七禾页丫14 小时前
面试记录12 中级c++开发工程师
c++·面试·职场和发展
会飞的架狗师14 小时前
DDD笔记 | 实体、值对象、聚合、聚合根
设计模式·设计规范
zmzb010315 小时前
C++课后习题训练记录Day56
开发语言·c++
编程小Y15 小时前
C++ Insights
开发语言·c++
王老师青少年编程16 小时前
csp信奥赛C++标准模板库STL案例应用5
c++·stl·set·集合·标准模板库·csp·信奥赛
历程里程碑16 小时前
hot 206
java·开发语言·数据结构·c++·python·算法·排序算法
Tipriest_16 小时前
C++ 的 ranges 和 Python 的 bisect 在二分查找中的应用与实现
c++·python·算法·二分法
誰能久伴不乏16 小时前
epoll 学习踩坑:`fcntl` 设置非阻塞到底用 `F_SETFL` 还是 `F_SETFD`?
linux·服务器·网络·c++·tcp/ip