JavaScript中的发布订阅模式和观察者模式的区别
观察者模式 Observer pattern
观察者和被观察者是松解耦的,被观察者维护一个观察者的集合,当有消息时,被观察者发送通知给集合里面的所有观察者,
代码实现思路
-
创建一个观察者和被观察者,观察者用来创建一个函数,名称都是notify,被观察者用来维护一个观察者队列,创建的观察者可以被放入队列,也可以被从队列中删除
-
当需要通知观察者时,主题遍历维护的观察者队列,调用对应的函数
观察者集合(这里是单独一个类,也可以合并到Subject类里面)
class ObserverList {
constructor(){
this.list = []
}
add(fun) {
this.list.push(fun)
}
remove(fun){
const index = this.list.indexOf(fun)
if (index < 0 || this.list.length > index) {
return
}
this.list.splic(index, 1)
}
}
观察者
class Observer {
constructor(fun) {
this.notify = fun
}
}
被观察者(主题)
class Subject {
constructor(){
this.observers = new ObserverList()
}
add (obj) {
this.observers.push(obj)
}
remove (obj) {
this.observers.remove(obj)
}
notify () {
for (let i = 0; i < this.observers.list.length; i++) {
this.observers.list[i].notify()
}
}
}
发布订阅模式 Publish-Subscribe pattern
与观察者模式不一样的是,发布者并不会直接通知订阅者,发布者和订阅者直接互不相识,他们通过第三者:消息队列(中心)进行中转发送,同时我们可以在消息中心对数据进行处理
// 定义消息中
class EventBus {
constructor() {
this.eventBus = []
}
subscribe (key, cb) {
this.eventBus.push({
[key]: cb
})
}
publish (key, params) {
console.log(key, params, this.eventBus)
for (let i = 0; i < this.eventBus.length; i++) {
if (this.eventBus[i][key]) {
this.eventBus[i][key](params)
}
}
}
}
export default new EventBus()