设计模式:5. 命令模式
你需要制作一个遥控器,它可以控制家中的各个电器。但是如果将具体的实现绑定到遥控器上,那么遥控器的生产成本太大了。我们想要的是,能够批量生产统一的遥控器来实现功能,为了能够适配不同的电器,或许我们可以设计一个可插拔的功能模块,由模块实现具体的功能。另外,这个遥控器还能够支持撤销操作的功能。
为了实现这种可插拔的设计,我们需要将‘请求’本身抽象出来。我们定义一个命令(Command)接口,所有的具体功能模块都实现这个接口。
class Command
{
public:
virtual void execute() = 0;
virtual void undo() = 0;
};
遥控器实现
class RemoteControl
{
public:
void setCommand(Command* command);
void action()
{
m_command->execute();
}
void undo()
{
m_command->undo();
}
private:
Command* m_command;
};
比如我们要控制一盏灯
class Light
{
public:
void turnOn();
void turnOff();
};
实现具体的功能模块
class LightOnCommand: public Command
{
public:
LightOnCommand(Light* light): m_light(light) {}
void execute()
{
m_light->turnOn();
}
void undo()
{
m_light->turnOff();
}
private:
Light* m_light;
};
之后,客户端可以通过这个遥控器来控制家具了
int main()
{
Light* light = new Light;
RomoteControl* romoteControl = new RomoteControl;
Command* command = new LightOnCommand(light);
romoteControl->setCommand(command);
// 使用遥控器
romoteControl->action(); // 开灯
romoteControl->undo(); // 关灯
}
命令模式的优点是,能够将命令进行封装,可以记录命令,延迟执行,或者放入线程执行队列,亦能记录命令日志,并通过日志进行撤销还原等功能。
命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式支持可撤销的操作。

浙公网安备 33010602011771号