一直对观察者模式有一些混淆,
今天总结记录一下
下面从将说理列(讲概念,说用途,理核心设计思路,列优缺点)面入手,讲明白其中的内容
概念趴:
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。
观察者模式通常由两类对象组成:主题(Subject)和观察者(Observer)。主题维护一个观察者列表,当主题的状态发生变化时,它会通知列表中的所有观察者进行更新。
主题维护一个观察者列表和提供添加,删除,通知的功能接口;观察者自身维护一个更新的方法,
核心设计思路:
定义一种一对多的依赖关系,即让多个观察者对象同时监听一个主题对象,当主题对象状态发生变化时,它会自动通知所有观察者进行更新
使用场景:
- 当一个对象的状态发生变化时需要通知其他多个对象进行更新
- 当一个对象需要在状态变化时执行一些操作,但这些操作和对象本身无关时
- 当一个对象需要通知其他对象,但又希望它们能够自由地添加或移除自己时 在实现上,可以使用订阅-发布模式或者回调函数来实现
使用观察者模式可以实现松耦合的设计,让主题和观察者之间的耦合度更低,提高代码的灵活性和可维护性。它可以用于许多场景,例如实现事件处理、模型-视图-控制器(MVC)模式、GUI编程等等
优缺点:
优点
- 观察者模式实现松耦合的设计,主题对象和观察者对象之间的依赖度更低,可以提高代码的灵活性和可维护性
- 观察者模式可以实现一对多的依赖关系,当主题对象状态发生变化时,所有观察者对象都可以自动更新,从而避免了手动维护对象状态的复杂性
缺点
- 观察者模式可能会导致性能问题,当观察者数量很多时,主题对象状态变化时需要通知所有观察者进行更新,这可能会消耗大量的时间和内存
- 如果观察者对象和主题对象之间的关系不够清晰,可能会导致代码难以理解和维护
// 定义一个主题对象
class Subject{
constructor(){
this.observers = []; // 维护一个观察者队列
}
// 有添加,移除,通知接口
// 添加观察者
addObserver(observer){
this.observers.push(observer)
}
// 移除
removeObserver(observer){
let index = this.observers.indexOf(observer)
if(index > -1){
this.observers.splice(index, 1)
}
}
// 通知观察者
notify(msg){
this.observers.forEach(observer => {
// 观察者自己内部的处理更新数据的方法
observer.update(msg)
})
}
}
// 定义一个观察者对象
class Observer{
constructor(name){
this.name = name;
}
// 接收通知并进行处理
update(msg){
// do something
console.log(`[${this.name}] received message: ${message}`);
}
}
// 使用示例
const subject = new Subject();
// 创建两个观察者对象
const observer1 = new Observer('Observer1');
const observer2 = new Observer('Observer2');
// 将观察者添加到主题对象的观察者列表中
subject.addObserver(observer1);
subject.addObserver(observer2);
// 发送通知
subject.notify('Hello World');
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天 点击查看详情