TypeScript | 设计模式13 - 观察者模式

187 阅读2分钟

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

中介者模式

中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使他们通过一个中介对象进行合作。

模式结构

  • 中介者:

    • 抽象中介者:接口声明与组件交流的方法,但通常仅包括一个通知方法。
    • 具体中介者:封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理甚至有时会对其生命周期进行管理。
  • 组件:包含业务逻辑的类,每个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。

    • 抽象组件类:定义组件类的接口,提供组件对象交互的抽象方法,实现所有相互影响的组件类的公共功能
    • 具体组件类:是抽象组件类的实现者,当需要与其他组件交互时,由中介对象负责交互。
// 抽象中介
  abstract class Mediator {
    notify(comp: BaseComponent) {}
  }
  //具体中介者
  class MediatorA extends Mediator {
    constructor(private comp1: BaseComponent, private comp2: BaseComponent) {
      super();
    }
  ​
    notify(sendr: BaseComponent) {
      this.comp1.callM();
      this.comp2.callM();
    }
  }
  ​
  // 抽象组件
  class BaseComponent {
    callM() {
        throw new Error("Method not implemented.");
    }
    constructor(public mediator?: Mediator) {}
  ​
    setMed(med: Mediator){
        this.mediator = med;
    }
  }
  ​
  // 具体组件A
  class ComponentA extends BaseComponent {
    
  send() {
      this.mediator.notify(this);
    }
  ​
    callM() {
      console.log("中介者发送组件A请求");
    }
  }
  // 具体组件B
  class ComponentB extends BaseComponent {
    send() {
      this.mediator.notify(this);
    }
  ​
    callM() {
      console.log("中介者发送组件B请求");
    }
  }
  ​
  (() => {
    const c1 = new ComponentA();
    const c2 = new ComponentB();
  ​
   const med = new MediatorA(c1, c2);
   
    c1.send();
    c2.send();
  })();
  ​

主要优点

  • 各个类都各司其职,符合迪米特法则
  • 降低对象之间的耦合性,使得对象易于独立被复用
  • 将对象间的一对多关系转变成一对一关系,使得系统异域维护和扩展

使用场景:

  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。