js设计模式---观察者模式
1、概念
Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
注意:有的人也称其为发布订阅模式,但二者其实有细微的差别,发布订阅模式比观察者模式多了一个调度中心。如下图:
左为观察者模式,右为发布订阅模式。
2、观察者模式角色
-
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
-
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
3、代码实现
场景:商店售卖商品,顾客订阅商品信息,当商品数量出现变化时,通知给每一位订阅该消息的顾客
扫描二维码关注公众号,回复:
12880036 查看本文章
// 被观察者
class Subject {
constructor(name) {
this.name = name
this.observer = [] // 已订阅的观察者对象
this.goodsCount = 0 // 商店的商品,此时商品数量都为0
}
// 顾客订阅商店的商品事件
on(observer) {
this.observer.push(observer)
}
// 改变商品的数量
updateGoodsCount(newCount) {
this.goodsCount = newCount
// 派发消息给每一个顾客
this.emit()
}
// 发送消息给一订阅的顾客
emit() {
this.observer.forEach(ob => {
ob.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) // 修改商品的数量,订阅者将收到消息
subject.updateGoodsCount(2) // 修改商品的数量,订阅者将收到消息
输出结果:
亲爱的顾客1,现在商品数量为1
亲爱的顾客2,现在商品数量为1
亲爱的顾客1,现在商品数量为2
亲爱的顾客2,现在商品数量为2