阅读量:120
C++中的命令模式(Command Pattern)是一种行为设计模式,它允许你将一个请求封装为一个对象,从而使你可以使用不同的请求、队列或日志请求,并支持可撤销的操作。命令模式通常包括以下几个角色:
- 命令接口(Command):声明执行操作的接口。
- 具体命令(Concrete Command):实现了命令接口,通常包含一个接收者对象,并调用接收者的功能来完成命令要执行的操作。
- 接收者(Receiver):执行与执行命令相关的操作。任何类都可能成为一个接收者,只要它能够根据命令要求实现的相应功能。
- 调用者(Invoker):要求该命令执行这个请求。调用者并不知道接收者是谁,也不知道命令是怎么执行的,它只知道有一个命令接口可以调用。
- 客户端(Client):创建具体命令对象,并设置其接收者。
下面是一个简单的C++命令模式的实现示例:
#include
#include
// 命令接口
class Command {
public:
virtual ~Command() {}
virtual void execute() = 0;
};
// 接收者
class Light {
public:
void turnOn() {
std::cout << "Light turned on." << std class="hljs-function">void turnOff() {
std::cout << "Light turned off." << std class="hljs-comment">// 具体命令 - 打开灯
class TurnOnCommand : public Command {
private:
Light* light;
public:
TurnOnCommand(Light* light) : light(light) {}
void execute() override {
light->turnOn();
}
};
// 具体命令 - 关闭灯
class TurnOffCommand : public Command {
private:
Light* light;
public:
TurnOffCommand(Light* light) : light(light) {}
void execute() override {
light->turnOff();
}
};
// 调用者
class RemoteControl {
private:
std::vector commands;
public:
void addCommand(Command* command) {
commands.push_back(command);
}
void executeCommands() {
for (auto& command : commands) {
command->execute();
}
}
};
// 客户端
int main() {
Light light;
TurnOnCommand turnOn(&light);
TurnOffCommand turnOff(&light);
RemoteControl remoteControl;
remoteControl.addCommand(&turnOn);
remoteControl.addCommand(&turnOff);
remoteControl.executeCommands();
return 0;
}
在这个示例中,我们创建了一个简单的灯(Light)类,它有两个方法:打开(turnOn)和关闭(turnOff)。然后我们创建了两个具体命令类:TurnOnCommand 和 TurnOffCommand,它们分别实现了命令接口(Command),并在执行方法中调用了 Light 类的相应方法。RemoteControl 类作为调用者,它接收并存储命令对象,然后遍历执行这些命令。在客户端代码中,我们创建了一个 Light 对象和两个具体命令对象,并将它们添加到 RemoteControl 对象中,最后执行这些命令。