观察者模式中主体和观察者是互相感知的,发布/订阅者模式是借助第三方来实现调度的,发布者和订阅者之间互不感知。
接下来通过代码来了解两种模式的区别
观察者:
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)
观察者模式与主体是一种紧耦合的状态,而发布/订阅者与主体之间是一种松耦合的状态
总的来说,发布/订阅者适合更加复杂的模式
参考:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/25