JavaScript - 观察者模式

实现一个 Subject 类,通知观察者

js
123456789101112131415
class Subject {
// 被观察者
constructor() {
this.observers = []
}
add(observer) {
this.observers.push(observer)
}
notify(newMsg) {
this.observers.forEach(i => i.update(newMsg))
}
delete(observer) {
this.observers = this.observers.filter(i => i !== observer)
}
}

实现一个 Observer 类,处理更新

js
123456789
class Observer {
// 观察者
constructor(name) {
this.name = name
}
update(newMsg) {
console.log(newMsg + "==> " + this.name + "收到了")
}
}

实例化一个被观察者

js
1
let sub = new Subject()

实例化一个或多个观察者

js
12
let observer1 = new Observer("观察者1")
let observer2 = new Observer("观察者2")

用 add 方法进行绑定

js
12
sub.add(observer1) // Observer1 观察 sub
sub.add(observer2) // Observer2 观察 sub

用 notify 方法进行通知

js
1234
sub.notify("我是被观察者,我发布了第一个信息!") // sub 发布消息
// 我是被观察者,我发布了第一个信息!==> 观察者1收到了
// 我是被观察者,我发布了第一个信息!==> 观察者2收到了

用 delete 方法进行解绑

js
12345
sub.delete(observer1) // Observer1 取消观察 sub
sub.notify("我是被观察者,我发布了第二个信息!") // sub 发布消息
// 我是被观察者,我发布了第二个信息!==> 观察者2收到了