1 命令模式
1.1 定义
“命令模式”将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
1.2 类图
1.3 代码
// 接口类
class Command
{
public:
Command() = default;
~Command() = default;
public:
virtual void execute() = 0;// 用于执行命令
virtual void undo() = 0;// 用于撤销命令
};
// 灯类
class Light
{
public:
Light() = default;
~Light() = default;
public:
void on();
void off();
};
void Light::on()
{
std::cout << "Light is on!";
}
void Light::off()
{
std::cout << "Light is off!";
}
// 开灯的命令类
class LightOnCommand:public Command
{
public:
LightOnCommand(Light light);
~LightOnCommand() = default;
void execute() override;
Light light_;
};
LightOnCommand::LightOnCommand(Light light)
:light_(light)
{
}
void LightOnCommand::execute()
{
light_.on();
}
// 遥控类
class RemoteControl
{
public:
RemoteControl() = default;
~RemoteControl() = default;
void setCommand(Command* command);
void buttonwasPressed();
private:
Command* slot;
};
void RemoteControl::setCommand(Command* command)
{
slot = command;
}
void RemoteControl::buttonwasPressed()
{
slot->execute();
}
1.4 代码类图
1.5 优缺点
- 降低对象之间的耦合度
- 新的命令可以很容易地加入到系统中
- 可以比较容易地设计一个组合命令
- 调用同一方法实现不同功能
1.6 其他用途
- 队列请求
- 日志请求
1.7 总结
- 命令模式将发出请求的对象和执行请求的对象解耦
- 在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
- 调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用
- 实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作委托给接收者
- 命令也可以用来实现日志和事务系统
- Meta Command Pattern可以创建命令的宏,以便一次执行多个命令。