美文网首页
实现观察者模式

实现观察者模式

作者: Egde | 来源:发表于2021-01-09 22:05 被阅读0次

    事件监听机制,是一种观察者模式实现

    针对问题去写,感觉有针对性好一些

    function PubSub() {
      this.handler = {}
    }
    
    PubSub.prototype.on = function(type, handle) {
      if (!this.handles[type]) {
        return false
      }
      this.handles[type].push(handle)
    }
    
    PubSub.prototype.emit = function () {
      let type = Array.prototype.shift.call(arguments) // shift,改变原数组,返回首位
      // 如果没有事件,返回
      if (!this.handler[type]) return false
      // 找到事件对应的回调数组
      for (let i; i < this.handler[type].length; i++) {
        let handle = this.handler[type][i]
        handle.apply(this, arguments) // 理解下这个this
      }
    }
    
    PubSub.prototype.off = function (type, handle) { // handle 是一个函数引用
      let handles = this.handler[type]
      if (handles) {
        if (!handle) { // 没有回调的时候,就清空全部
          handles.length = 0  // 清空数组  
        } else {
          for (let i = 0; i < handles.length; i++) {
            let _handle = handles[i]
            if (_handle === handle) {
              handle.splice(i, 1)
            }
          }
        }
      }
    }
    

    另一种

    大体的架子,里面有一个立即执行函数

        const Observe = (function () {
            //防止消息队列暴露而被篡改,将消息容器设置为私有变量
            let __message = {};
            return {
                //注册消息接口
                on : function () {},
                //发布消息接口
                subscribe : function () {},
                //移除消息接口
                off : function () {}
            }
        })();
    

    EventBus方式

    class EventBus {
      constructor() {
        this.events = {}
      }
    
      on(key, cb) { this.events[key].push(cb) }
    
      trigger(key, args) { 
        this.events[key].forEach(function (cb) {
          cb.call(this, ...args)
        })
      }
      
      remove() {}
    }
    
    const event = new EventBus()
    
    参考

    JavaScript设计模式之观察者模式

    相关文章

      网友评论

          本文标题:实现观察者模式

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