C++中的命令模式(Command Pattern)是一种行为设计模式,它允许你将请求封装为一个对象,从而使你可以使用不同的请求把客户端参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
为了提高C++中命令模式的复用性,你可以采取以下几个步骤:
使用接口或抽象基类:定义一个命令接口或抽象基类,其中包含执行命令所需的纯虚函数。这样,你可以创建多个具体的命令类,它们都继承自这个接口或基类,并实现自己的行为。
class Command {
public:
virtual ~Command() {}
virtual void execute() = 0;
};
参数化命令:通过构造函数或setter方法将命令接收者传递给命令对象。这样,不同的命令可以使用相同的接口,但处理不同的参数。
class LightOnCommand : public Command {
private:
Light* light;
public:
LightOnCommand(Light* light) : light(light) {}
void execute() override {
light->on();
}
};
使用智能指针管理资源:为了提高代码的安全性和复用性,使用智能指针(如std::shared_ptr
和std::unique_ptr
)来管理资源,避免内存泄漏。
std::unique_ptr<Command> command = std::make_unique<LightOnCommand>(light);
命令队列和撤销功能:通过实现命令队列来支持命令的排队执行,以及实现撤销功能来支持对已执行命令的撤销。
class CommandManager {
private:
std::stack<std::unique_ptr<Command>> commandQueue;
public:
void executeCommand(std::unique_ptr<Command> command) {
commandQueue.push(std::move(command));
}
void undoLastCommand() {
if (!commandQueue.empty()) {
commandQueue.pop();
}
}
void executeNextCommand() {
if (!commandQueue.empty()) {
commandQueue.top()->execute();
commandQueue.pop();
}
}
};
组合命令:通过实现组合命令(Command Composite),你可以将多个命令组合成一个复合命令,这样就可以像操作单个命令一样操作整个命令组合。
class CompositeCommand : public Command {
private:
std::vector<std::unique_ptr<Command>> commands;
public:
void addCommand(std::unique_ptr<Command> command) {
commands.push_back(std::move(command));
}
void execute() override {
for (auto& command : commands) {
command->execute();
}
}
};
通过遵循这些步骤,你可以创建一个灵活且可重用的命令模式实现,它可以在不同的场景和应用程序中轻松使用。