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

372 阅读2分钟

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

观察者模式

指多个对象间存在依赖关系,当一个 对象发生变化时,所有依赖于它的对象都得到通知并自动更新。就是通过定义一种订阅机制,对象事件发生变化时通知给观察者。

就比如,当订阅了一份杂志,你不需要去报摊去查询新的出版的刊物,出版社在刊物出版后通过邮件或短信通知你。这样你就可以去购买。

模式结构

  • 抽象主题,抽象目标,提供一个用于保存观察者对象的操作,以及通知观察者的抽象方法
  • 具体主题:具体目标类,实现抽象目标类中的方法,和通知方法,当具体目标的内部发生变化时,通知所有注册过观察者对象
  • 抽象观察者:它是抽象类或接口,以及一个更新自己的抽象方法,当接收到目标类变化的通知时调用
  • 具体观察者:实现抽象观察者定义的抽象方法,因可能存在多个观察者,有自己行为。
interface TargetObj{
    add(obs: Observer):void
    notifyObserver():void
}
​
class UserTarget implements TargetObj {
    private listObserver: Observer[] = [];
    add(obs: Observer): void {
       this.listObserver.push(obs);
       console.log('添加了数据')
    }
    notifyObserver(): void {
        this.listObserver.forEach(obs => {
            obs.receiver();
        });
    }
}
​
interface Observer {
    receiver():void
}
​
class ObserverObj implements Observer {
    receiver(): void {
       console.log('收到变化通知,进入调整...')
    }
}
​
​
class ObserverObj2 implements Observer {
    receiver(): void {
       console.log('我也收到通知,立即处理...')
    }
}
​
(()=>{
    const abUser = new UserTarget();
    const obj = new ObserverObj();
    const obj2 = new ObserverObj2();
    abUser.add(obj);
    abUser.add(obj2);
    abUser.notifyObserver();
})();

主要优点:

  • 目标和观察者类之间耦合关系是抽象耦合关系,符合依赖倒置原则
  • 降低目标和观察者类的耦合关系,仅在运行时才建立起对象之间的关系
  • 无需修改目标类就能引入新的观察者类,符合开闭原则

主要缺点:

  • 目标和观察者之间存在依赖,需避免出现循环引用
  • 若观察者很多,通知发布可能会更耗时间

使用场景:

当一个对象的状态改变时需要改变其他的对象,或者实际对象是事先未知的或动态变化时,可使用观察者模式。

\