观察者模式 Observer
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
观察者模式 (Observer Pattern):定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
观察者模式是一种对象行为型模式。
观察者模式中通常有两个模型,一个观察者(observer)和一个观察目标/被观察者(Observed)
观察者模式的别名包括发布 - 订阅(Publish/Subscribe)模式、模型 - 视图(Model/View)模式、源 - 监听器(Source/Listener)模式或从属者(Dependents)模式。
细究的话,发布订阅和观察者有些不同,可以理解成发布订阅模式属于广义上的观察者模式。
实现
js
// 定义观察者对象
class Observer {
constructor(name, subject) {
this.name = name
if (subject) {
subject.add(this)
}
}
notify(message) {
console.log(this.name, 'hello', message)
}
}
// 定义一个观察目标对象
class Subject {
constructor() {
this.observerList = []
}
add(observer) {
// 添加
this.observerList.push(observer)
}
remove(observer) {
// 移除
const result = []
for (let i = 0; i < this.observerList.length; i++) {
const current = this.observerList[i]
if (current.name !== observer.name) {
result.push(current)
}
}
this.observerList = result
return this
// const index = this.observerList.findIndex(o => o.name === observer.name);
// this.observerList.splice(index, 1);
}
notify(message) {
// 通知所有观察者
const observers = this.observerList
observers.forEach((observer) => observer.notify(message))
}
}
// testing
let sub = new Subject()
let obs1 = new Observer('observer1', sub)
let obs2 = new Observer('observer2')
sub.add(obs2)
sub.notify('world')