alianzhang / Personal-summary

这是我个人的代码知识块总结,备注比较多,方便理解,适合初学者参考借鉴
0 stars 0 forks source link

观察者模式和发布订阅模式的有什么区别 #9

Open alianzhang opened 4 years ago

alianzhang commented 4 years ago

image

alianzhang commented 4 years ago

观察者模式代码如下:

var subject = {
    observers: [],
    notify() {
        this.observers.forEach(observer =>{
            observer.update()
        })
    },
    attach (observer) {
        this.observers.push(observer)
    }
}
var observer = {
    update(){
        alert('updated')
    }
}
subject.attach(observer)
subject.notify()

订阅发布模式代码如下:

var publisher = {
    publish(pubsub) {
        pubsub.publish()
    }
}
var pubsub = {
    subscribes: [],
    publish() {
        this.subscribes.forEach(subscribe =>{
            subscribe.update();
        })
    },
    subscribe(sub) {
        this.subscribes.push(sub)
    }
}
var subscribe = {
    update() {
        console.log('update')
    },
        subscribe(pubsub) {
            pubsub.subscribe(this);
        }
}
subscribe.subscribe(pubsub)
publisher.publish(pubsub)

自己认为,两种模式本质都是一样的,主要关键点都在于注册(添加到注册数组中)和触发(触发注册数组中的内容),只是订阅/发布模式对注册和触发进行了解耦。可以看到,使用订阅发布模式中发布者触发publish的时候,可以选择触发哪一些订阅者集合(因为publish参数传递了中间集合,可以定义多个pubsub集合),而观察者模式则只能触发所有的被观察对象。

alianzhang commented 4 years ago

观察者模式: 假如现在有一个楼盘将要开盘(这个楼盘是一个主体,里面有销售人员,有保安人员等等), 然后有很多人(很多观察者)来买房,然后这些人把自己的电话留在售楼部(每个观察者都把自己注册到目标), 当确定楼盘开盘日期的时候,就由售楼部的销售人员通知这些留下电话的买房的人。 在这里,买房的人必须把自己的电话号码留在售楼部(观察者必须把自己注册到主体里), 不然楼盘的销售人员是无法通知要买房的人的,这之间就产生了联系。 发布订阅模式: 假设有一个中介,有很多想把自己的房子卖了的人,就把自己的房产信息留下。 然后有很多想要买二手房的人,把自己的电话也留在了中介。 这之间,买房的和卖房的一点关系都没有,谁都不知道谁的存在,买房的等着中介通知它有没有房。