命令模式将请求封装为对象,实现调用者与接收者的解耦。1. Command接口定义execute方法;2. ConcreteCommand实现具体操作并绑定Receiver;3. Receiver执行实际动作;4. Invoker通过调用命令的execute发起请求;5. Client创建命令并绑定接收者。示例中遥控器(Invoker)通过LightOnCommand和LightOffCommand控制电灯(Receiver)的开关,支持扩展undo方法实现撤销功能,适用于GUI、任务调度等需参数化操作的场景。

在C++中,命令模式(Command Pattern)是一种行为设计模式,它将“请求”封装成对象,从而使你可以用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
核心思想是:把一个操作(比如打开灯、保存文件)变成一个对象(命令对象),这个对象知道接收者和要执行的动作,并能执行该动作。调用者不需要知道具体执行细节,只需要调用命令的execute方法即可。
命令模式通常包含以下几个角色:
以下是一个简单的例子:用命令模式控制电灯的开关。
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <memory>
// 接收者:电灯
class Light {
public:
void on() {
std::cout << "Light is ON\n";
}
void off() {
std::cout << "Light is OFF\n";
}
};
// 命令接口
class Command {
public:
virtual ~Command() = default;
virtual void execute() = 0;
};
// 具体命令:开灯
class LightOnCommand : public Command {
Light& light;
public:
explicit LightOnCommand(Light& l) : light(l) {}
void execute() override {
light.on();
}
};
// 具体命令:关灯
class LightOffCommand : public Command {
Light& light;
public:
explicit LightOffCommand(Light& l) : light(l) {}
void execute() override {
light.off();
}
};
// 调用者:遥控器
class RemoteControl {
std::unique_ptr<Command> command;
public:
void setCommand(std::unique_ptr<Command> cmd) {
command = std::move(cmd);
}
void pressButton() {
if (command) {
command->execute();
}
}
};
在main函数中组装对象并运行:
int main() {
Light livingRoomLight;
// 创建具体命令
auto onCmd = std::make_unique<LightOnCommand>(livingRoomLight);
auto offCmd = std::make_unique<LightOffCommand>(livingRoomLight);
RemoteControl remote;
// 设置并执行开灯命令
remote.setCommand(std::move(onCmd));
remote.pressButton();
// 设置并执行关灯命令
remote.setCommand(std::move(offCmd));
remote.pressButton();
return 0;
}
命令模式很容易支持撤销操作。只需在Command接口中添加undo方法。
class Command {
public:
virtual ~Command() = default;
virtual void execute() = 0;
virtual void undo() = 0; // 新增撤销
};
// 修改 LightOnCommand 支持撤销
class LightOnCommand : public Command {
Light& light;
public:
explicit LightOnCommand(Light& l) : light(l) {}
void execute() override {
light.on();
}
void undo() override {
light.off();
}
};
// 类似地,LightOffCommand 的 undo 是开灯
void undo() override {
light.on();
}
RemoteControl 可以记录上一个命令,在用户按下“撤销”时调用undo。
命令模式的优势包括:
适用于需要将操作参数化、记录操作日志、支持撤销机制的系统,如GUI按钮、菜单项、任务调度等。
基本上就这些。通过将请求封装为对象,C++中的命令模式提升了系统的灵活性和扩展性。
以上就是c++++如何实现一个命令设计模式_c++将请求封装成对象的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号