设计模式:发布/订阅模式(观察者模式)

186 阅读1分钟

发布/订阅模式(即观察者模式): 设计该模式主要形成松散耦合。在这种模式中,并不是一个对象调用另一个对象的方法,而是一个订阅者对象订阅发布者对象的特定活动,并在发布者对象的状态发生改变后,订阅者对象获得通知。订阅者也称为观察者,而被观察的对象称为发布者。当发生了一个重要的事件时,发布者将会通知(调用)所有订阅者,并且可能经常以事件对象的形式传递消息。

基本思路:发布者对象需要一个数组类型的属性,以存储所有的订阅者。订阅(即注册)就是将新的订阅者加入到这个数组中去,而注销即是从这个数组中删除某个订阅者。此外,发布消息就是循环遍历订阅者列表并通知他们。

class Event{
  constructor () {
  	// 事件名为属性,值为事件函数组成的数组
    this.callback = {}
  }
  // 订阅事件
  $on(name, fn) {
    (this.callback[name] || (this.callback[name] = [])).push(fn)
  }
  // 发布事件
  $emit(name, args) {
    const cbs = this.callback[name]
    if (cbs){
      // 将该事件的事件数组循环调用
      cbs.forEach(fn => {
        fn.call(this, args)
      })
    }
  }
  // 注销
  $off(name){
    this.callback[name] = null
  }
}

测试

const event = new Event()

event.$on('push', (name) => {
  console.log('push', name);
})
event.$on('event', (name) => {
  console.log('event', name);
})

event.$emit('push', '发布')
event.$emit('event', '事件')
event.$off('event')
event.$emit('event', '事件解除')