js设计模式---观察者模式原理与实现

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

猜你喜欢

转载自blog.csdn.net/qq_16687863/article/details/105446367
今日推荐