1、概念
观察者模式是一种行为模式,作用是当一个对象的状态发生变化时,能够自动通知其关联对象,自动刷新对象状态。
观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
注意:观察者模式和发布订阅模式类似但是有细微差别,发布订阅模式比观察者模式多了一个调度中心。如下图:
2、观察者模式角色
-
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
-
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
3、代码实现
场景:商店售卖商品,顾客订阅商品信息,当商品数量出现变化时,通知给每一位订阅该消息的顾客
// 被观察者
class Subject {
constructor(name) {
this.name = name
this.observers = [] // 已注册的观察者列表
this.goodsCount = 0 // 商店的商品,此时商品数量都为0
}
// 顾客订阅商店的商品事件
on(observer) {
this.observers.push(observer)
}
// 改变商品的数量
updateGoodsCount(newCount) {
this.goodsCount = newCount
// 派发消息给每一个顾客
this.emit()
}
// 发送消息给一订阅的顾客
emit() {
this.observers.forEach(observer => {
observer.getMessage(this.goodsCount)
})
}
}
// 观察者
class Observer {
constructor(name) {
this.name = name
}
// 接受商店派发的消息
getMessage(goodsCount) {
console.log(`亲爱的${this.name}, 现在商品数量为${goodsCount}`)
}
}
let subject = new Subject("商店")
let o1 = new Observer("顾客1")
let o2 = new Observer("顾客2")
subject.on(o1)
subject.on(o2)
//修改商品的数量,订阅者将收到消息
subject.updateGoodsCount(1)
// 亲爱的顾客1,现在商品数量为1
// 亲爱的顾客2,现在商品数量为1
subject.updateGoodsCount(2)
//亲爱的顾客1,现在商品数量为2
// 亲爱的顾客2,现在商品数量为2