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

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

#include 
#include 

// 命令接口
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()函数,调用者会依次执行命令列表中的命令。
通过命令模式,客户端可以将请求封装成命令对象,从而将请求发送者和请求接收者解耦。这样,可以灵活地组合和操作不同的请求。命令模式还支持撤销、重做等功能的实现。

你可能感兴趣的:(设计模式,设计模式,命令模式,c++)