发布订阅模式和观察者模式

发布订阅模式和观察者模式

就算身处低谷,也要向阳而生。

  • 发布/订阅模式

    订阅者

    发布者

    信号中心

<script>
    // 事件触发器
    class EventEmitter {
      constructor () {
        // { 'click': [fn1, fn2], 'change': [fn] }
        this.subs = Object.create(null)
      }
      // 注册事件
      $on (eventType, handler) {
        this.subs[eventType] = this.subs[eventType] || []
        this.subs[eventType].push(handler)
      }
      // 触发事件
      $emit (eventType) {
        if (this.subs[eventType]) {
          this.subs[eventType].forEach(handler => {
            handler()
          })
        }
      }
    }
    // 测试
    let em = new EventEmitter()
    em.$on('click', () => {
      console.log('click1')
    })
    em.$on('click', () => {
      console.log('click2')
    })

    em.$emit('click')
  </script>
  • 观察者模式

    观察者(订阅者) – Watcher

    ​ update():当事件发生时,具体要做的事情

    目标(发布者) – Dep

    ​ subs数组:存储所有的观察者

    ​ addSub():添加观察者

    ​ notify():当事件发生,调用所有观察者的update()方法

    没有事件中心

 <script>
    // 发布者-目标
    class Dep {
      constructor () {
        // 记录所有的订阅者
        this.subs = []
      }
      // 添加订阅者
      addSub (sub) {
        if (sub && sub.update) {
          this.subs.push(sub)
        }
      }
      // 发布通知
      notify () {
        this.subs.forEach(sub => {
          sub.update()
        })
      }
    }
    // 订阅者-观察者
    class Watcher {
      update () {
        console.log('update')
      }
    }

    // 测试
    let dep = new Dep()
    let watcher = new Watcher()

    dep.addSub(watcher)

    dep.notify()
  </script>
  • 总结

    观察者模式 是由具体目标调度,比如当事件触发,Dep就会去调用观察者的方法,所以观察者模式的订阅者与发布者时存在依赖的

    发布/订阅模式由统一调度中心调用,由此发布者与订阅者不需要知道对方的存在
    发布订阅模式和观察者模式_第1张图片

你可能感兴趣的:(前端,观察者模式,javascript,开发语言)