TypeScript | 设计模式14 - 命令模式

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

命令模式

将请求封装为一个对象,使得发出请求的责任和执行请求的责任分隔开,两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

模式结构

  • 抽象命令类:声明执行命令的接口,拥有执行命令的抽象方法
  • 具体命令类:是抽象命令类的具体实现,他拥有接收者对象,并通过调用接收者的工来完成命令要执行的操作
  • 实现者/接收者:执行命令功能的相关操作,是具体命令对象业务的真正实现者
  • 调用者/请求者:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者
(() => {
​
  const cmd = new ConcreteCommand(new Receiver());
  const ir = new Invoker(cmd);
  console.log("客户访问调用者的call()方法...");
  ir.call();
})();
​
//调用者
class Invoker {
  constructor(private command: Command) {
    this.command = command;
  }
​
  public setCommand(command: Command) {
    this.command = command;
  }
​
  public call() {
    console.log("调用者执行命令command...");
    this.command.execute();
  }
}
​
//抽象命令
interface Command {
  execute(): void;
}
​
//具体命令
class ConcreteCommand implements Command {
  constructor(private receiver: Receiver) {
    this.receiver = receiver;
  }
​
  public execute() {
    this.receiver.action();
  }
}
​
//接收者
class Receiver {
  constructor(){}
  public action() {
    console.log("接收者的action()方法被调用...");
  }
}
​
复制代码

开发中,方法请求者 与 方法的实现者 存在紧密的耦合关系时,将导致软件功能的扩展与维护。

主要优点

  • 引入抽象接口降低系统的耦合度
  • 使用命令模式进行增加和删除命令不会影响其他的类,且满足开闭原则,扩展性良好
  • 可以在现有命令的基础上,增加额外功能。比如日志记录,

主要缺点

  • 可能变得复杂,因在发送者和接收者中间增加了一个全新的层次

适用场景

  • 若需要通过操作来参数化对象时,可使用命令模式
  • 若想把操作放入队列中,操作的执行活着远程执行操作,可使用命令模式
  • 若想实现回滚功能操作时,可使用命令模式

Guess you like

Origin juejin.im/post/7032303198333632543