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::endl; } void turnOff() { std::cout << "Light turned off." << std::endl; } }; // 具体命令 - 打开灯 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 对象中,最后执行这些命令。