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