美文网首页
观察者模式——使用频率及面试频率最高的设计模式

观察者模式——使用频率及面试频率最高的设计模式

作者: 颖小李 | 来源:发表于2021-03-05 10:42 被阅读0次

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新。 —— Graphic Design Patterns

1.生活中的观察者模式---产品经理拉群,向开发同学、测试同学发布需求文档。

2.观察者模式里有两个核心的角色——发布者和订阅者
发布者需要做的:增加订阅者,通知订阅者,移除订阅者
订阅者能做的:被通知、去执行

3.发布-订阅模式观察者模式 的区别在于,是否存在第三方、发布者能否直接感知订阅者。
如果存在第三方,那么就是发布订阅模式;反之,则是观察者模式。

4.Event Bus/Event Emitter的实现

class EventEmitter {
  constructor() {
    // handlers是一个map,用于存储事件与回调之间的对应关系
    this.handlers = {}
  }

  // on方法用于安装事件监听器,它接受目标事件名和回调函数作为参数
  on(eventName, cb) {
    // 先检查一下目标事件名有没有对应的监听函数队列
    if (!this.handlers[eventName]) {
      // 如果没有,那么首先初始化一个监听函数队列
      this.handlers[eventName] = []
    }

    // 把回调函数推入目标事件的监听函数队列里去
    this.handlers[eventName].push(cb)
  }

  // emit方法用于触发目标事件,它接受事件名和监听函数入参作为参数
  emit(eventName, ...args) {
    // 检查目标事件是否有监听函数队列
    if (this.handlers[eventName]) {
      // 如果有,则逐个调用队列里的回调函数
      this.handlers[eventName].forEach((callback) => {
        callback(...args)
      })
    }
  }

  // 移除某个事件回调队列里的指定回调函数
  off(eventName, cb) {
    const callbacks = this.handlers[eventName]
    const index = callbacks.indexOf(cb)
    if (index !== -1) {
      callbacks.splice(index, 1)
    }
  }

  // 为事件注册单次监听器
  once(eventName, cb) {
    // 对回调函数进行包装,使其执行完毕自动被移除
    const wrapper = (...args) => {
      cb(...args)
      this.off(eventName, wrapper)
    }
    this.on(eventName, wrapper)
  }
}

参考:JavaScript设计模式之观察者模式1
JavaScript设计模式之观察者模式2

相关文章

网友评论

      本文标题:观察者模式——使用频率及面试频率最高的设计模式

      本文链接:https://www.haomeiwen.com/subject/hyskqltx.html