设计模式: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();  // 关灯
}

命令模式的优点是,能够将命令进行封装,可以记录命令,延迟执行,或者放入线程执行队列,亦能记录命令日志,并通过日志进行撤销还原等功能。
命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式支持可撤销的操作。

posted @ 2026-06-19 12:31  初五二十一  阅读(5)  评论(0)    收藏  举报