命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式主要包含以下几个角色:
- Command(抽象命令类):声明执行操作的接口。
- ConcreteCommand(具体命令类):是一个具体的命令,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
- Invoker(调用者):要求该命令执行这个请求。
- Receiver(接收者):知道如何实施与执行一个请求相关的操作。
命令模式的主要优点是:
- 降低系统的耦合度。
- 新的命令可以很容易地加入到系统中。
命令模式适用于以下场景: - 支持撤销的操作。
- 支持修改、排队或者追踪请求。
- 如果一个请求的接收者不明确,或者一个请求需要被多个对象处理。
- 用于处理一系列请求,可以进行批处理。
以下是一个简单的C++实现的命令模式(Command Pattern)示例:
#include <iostream>
// 抽象命令类
class Command {
public:
virtual void execute() = 0;
virtual ~Command() {}
};
// 接收者类
class Receiver {
public:
void action() {
std::cout << "Receiver action..." << std::endl;
}
};
// 具体命令类
class ConcreteCommand : public Command {
public:
ConcreteCommand(Receiver* receiver) : receiver_(receiver) {}
void execute() override {
receiver_->action();
}
private:
Receiver* receiver_;
};
// 调用者类
class Invoker {
public:
Invoker(Command* command) : command_(command) {}
void call() {
command_->execute();
}
private:
Command* command_;
};
int main() {
Receiver* receiver = new Receiver();
Command* command = new ConcreteCommand(receiver);
Invoker* invoker = new Invoker(command);
invoker->call();
delete invoker;
delete command;
delete receiver;
return 0;
}
在这个例子中,Command是抽象命令类,定义了一个execute接口。ConcreteCommand是具体命令类,实现了execute接口。
Receiver是接收者类,它知道如何实施和执行一个请求相关的操作。在ConcreteCommand的execute接口中,调用了Receiver的action接口。
Invoker是调用者类,它要求命令执行一个请求,也就是调用命令的execute接口。
通过这种方式,我们可以将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。