美文网首页
Typescript设计模式之订阅者模式

Typescript设计模式之订阅者模式

作者: 陌客百里 | 来源:发表于2020-08-21 23:32 被阅读0次

【序】(该系列为阅读公众号的读后感,对原公众号有剪辑工作,批注,学习的再加工,希望读者可以通过后面的原文地址进行阅读)昨天学习到了工厂模式确实拓宽了思路,用从express源码中学习到的知识在今天的coding当中就解决了一个之前因为没有优雅解决方案困扰的问题,因此在学习方面不能间断,继续加油,既然设计模式如此有用,那么今天就继续学习订阅者*模式吧,原文链接

问题一

  • 【疑惑】什么是订阅者模式?
  • 【解惑】订阅者模式,首先从对象拆分,分为主题(Subject)订阅者(Observer),主题发布后,会一一通知订阅者。
  • 【实现】
  1. 创建主题
    【关键】
    1. 要创建一个观察者队列,添加/删除观察者的方法,通知观察者的方法
    1. 调用主题的通知方法时,循环调用观察者的消息方法
    1. 在调用时去添加观察者
class Subject {
  private observers: Observer[] = [];
  public addObserver(observer: Observer): void {
    console.log(observer, "is pushed!");
    this.observers.push(observer);
  }
  public deleteObserver(observer: Observer): void {
    console.log("remove", observer);
    const n: number = this.observers.indexOf(observer);
    n != -1 && this.observers.splice(n, 1);
  }
  public notifyObservers(): void {
    console.log("notify all the observers", this.observers);
    this.observers.forEach(observer => observer.notify());
  }
}
  1. 创建观察者类
interface Observer {
  notify: Function;
}
class ConcreteObserver implements Observer {
  constructor(private name: string) { }

  notify() {
    console.log(`${this.name} has been notified.`);
  }
}
  1. 调用
function show(): void {
  const subject: Subject = new Subject();
  subject.addObserver(
    new ConcreteObserver(
      "Semlinker"
    ));
  subject.addObserver
    (
      new ConcreteObserver(
        "Kakuqo"
      ));
  subject.notifyObservers();
  subject.deleteObserver(
    new ConcreteObserver(
      "Lolo"
    ));
  subject.notifyObservers();
}
  • 【优点】
  1. 自动通知所有观察者
  2. 两者是在调用阶段才进行耦合的,要扩展和维护也很方便
  • 【缺点】
  1. 使用队列遍历的方式通知,一旦观察者过多将会增加耗时
  2. 一旦观察者与主题之间有耦合关系,就会出现循环调用,系统崩溃
  • 【使用场景】
    当一个对象的行为依赖另外一个对象的状态时

【总结】

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。该模式主要解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

相关文章

网友评论

      本文标题:Typescript设计模式之订阅者模式

      本文链接:https://www.haomeiwen.com/subject/fjqmjktx.html