这是我参与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();
})();
主要优点:
- 目标和观察者类之间耦合关系是抽象耦合关系,符合依赖倒置原则
- 降低目标和观察者类的耦合关系,仅在运行时才建立起对象之间的关系
- 无需修改目标类就能引入新的观察者类,符合开闭原则
主要缺点:
- 目标和观察者之间存在依赖,需避免出现循环引用
- 若观察者很多,通知发布可能会更耗时间
使用场景:
当一个对象的状态改变时需要改变其他的对象,或者实际对象是事先未知的或动态变化时,可使用观察者模式。
\