Skip to content

设计模式 - 发布订阅者模式

js
let EventListen = (function () {
  let list = {},
    trigger,
    listen,
    remove

  // 订阅
  listen = function (key, fn) {
    if (!this.list[key]) {
      this.list[key] = []
    }
    this.list[key].push(fn)
  }

  // 发布
  trigger = function () {
    // 对应的key取出来
    let key = Array.prototype.shift.call(arguments)
    let fns = this.list[key]
    if (!fns || fns.length === 0) {
      return
    }
    for (let i = 0, fn; (fn = fns[i++]); ) {
      fn.apply(this, arguments)
      // fn(...arguments)
    }
  }

  // 取消订阅
  remove = function (key, fn) {
    let fns = this.list[key]
    if (!fns) {
      return false
    }
    if (!fn) {
      fn && (fns.length = 0)
    } else {
      for (let i = fns.length; i >= 0; i--) {
        let _fn = fns[i]
        if (_fn === fn) {
          fns.splice(i, 1)
        }
      }
    }
  }
  return {
    list,
    trigger,
    listen,
    remove,
  }
})()

EventListen.listen('red', function (size) {
  console.log(`size是${size}`)
})
EventListen.listen('black', function (size) {
  console.log(`size是${size}`)
})
EventListen.trigger('red', 42)
EventListen.trigger('black', 43)
EventListen.trigger('black', 40)
EventListen.trigger('black', 41)