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

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

相关推荐
xlp666hub3 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
程序员Terry4 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
得物技术4 小时前
搜索 C++ 引擎回归能力建设:从自测到工程化准出|得物技术
c++·后端·测试
刀法如飞1 天前
AI时代,程序员都应该是算法思想工程师
人工智能·设计模式·程序员
xlp666hub1 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网1 天前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub1 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
在西安放羊的牛油果1 天前
我把 2000 行下单代码,重构成了一套交易前端架构
前端·设计模式·架构
不想写代码的星星1 天前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
xlp666hub2 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode