概述
![[observer1.excalidraw]]
特性
- 它是一系列对象之间的一种一对多关系
- 当订阅者有变动时,会通知对应的观察者
- 订阅者可以添加多个观察者
- 该模式是一种松耦合设计,观察者无需关注订阅者的内部细节,只需关于接口的定义即可
什么时候情况下用
- 消息通知
- 依赖于当订阅对象的变化时,需要执行动作
实现
javascript
class Subject {
observer = []
subscription(key, cb) {
this.observer.push({
key, cb
})
}
cancel(key) {
this.observer = this.observer.filter(v => v.key !== key)
}
notice(...args) {
this.observer.forEach(v => v.cb(...args))
}
}
const subject = new Subject()
subject.subscription('a1', (...args) => {
console.log('a1:', ...args);
})
subject.subscription('a2', (...args) => {
console.log('a2:', ...args);
})
console.log('first');
subject.notice('d', '1')
console.log('second');
subject.notice('c', '1',2,3,4)
shell
# 输出:
first
a1: d 1
a2: d 1
second
a1: c 1 2 3 4
a2: c 1 2 3 4
当然上面是最简单的设计,复杂一些可以做成一个 EventBus,可以订阅不同的事件
总结
观察者模式在日常开发中,比较常用,但要和订阅发布模式区分好。