命令command的用法 (command命令模式详解)

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

优点:

  1. 降低系统的耦合度,请求发送者和接收者之间没有直接的联系,请求发送者只需要知道如何发送请求,而不需要知道请求的处理细节。
  2. 可以方便地设计一个命令队列或宏命令(组合命令)。
  3. 可以方便地实现对请求的撤销和重做。
  4. 可以方便地将命令记入日志。
  5. 可以方便地实现对请求的延时执行和预约执行。

缺点:

  1. 使用命令模式可能会导致某些系统有过多的具体命令类。
  2. 系统的复杂性会增加。

应用场景:

  1. GUI 中菜单的设计,一个菜单项对应一个命令,菜单项的点击相当于调用命令的 execute() 方法。
  2. 模拟 CMD。
  3. 模拟多级撤销和重做操作。
  4. 模拟宏命令。
// 定义命令接口
class Command {
  execute() {}
  undo() {}
}


// 定义具体命令类
class ConcreteCommand extends Command {
  constructor(receiver) {
    super();
    this.receiver = receiver;
  }
  execute() {
    this.receiver.action();
  }
  undo() {
    this.receiver.undoAction();
  }
}


// 定义接收者类
class Receiver {
  action() {
    console.log('执行操作');
  }
  undoAction() {
    console.log('撤销操作');
  }
}


// 定义请求者类
class Invoker {
  constructor(command) {
    this.command = command;
  }
  setCommand(command) {
    this.command = command;
  }
  executeCommand() {
    this.command*ex.e**cute();
  }
  undoCommand() {
    this.command.undo();
  }
}


// 使用
const receiver = new Receiver();
const command = new ConcreteCommand(receiver);
const invoker = new Invoker(command);

invoker*ex.e**cuteCommand(); // 执行操作
invoker.undoCommand(); // 撤销操作