JavaScript中的发布订阅模式和观察者模式的区别

230 阅读1分钟

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, paramsthis.eventBus)
    for (let i = 0; i < this.eventBus.length; i++) {
      if (this.eventBus[i][key]) {
        this.eventBus[i][key](params)
      }
    }
  }
}

export default new EventBus()