美文网首页
(6)JavaScript订阅发布者模式

(6)JavaScript订阅发布者模式

作者: jaimor | 来源:发表于2019-04-26 08:42 被阅读0次

    概述

    订阅发布者模式如果不进行细腻度的划分也有称之为消息通信模式、中介模式或者观察者模式。故名思意需要有订阅和发布,当订阅了某一个事件后,通过发布操作可以通知到所有的订阅者执行相关操作。

    实现

    要完成订阅发布者模式,首先需要一个中介或者说叫做观察者:

    var Observe = {};    //这是一个观察者,所有的操作都由它来执行,可以将其定义为一个object
    

    其次就是需要一个保存订阅消息的容器:

    //由于需要一个内部私有容器来保存消息,所以需要将其改变下结构
    var Observe = (function () {
      var _message = {};    //用于保存订阅消息的容器
    }());
    

    最后就是需要有的操作,包括但不限于订阅操作和发布操作:

    var Observe = (function () {
      var _message = {};
      return {
        register: function () {},    //订阅操作
        publish: function () {}      //发布操作
      }
    }());
    

    然后完善一下订阅和发布的具体操作了:

    var Observe = (function () {
      var _message = {};
      return {
        register: function (type, fn) {    //消息类型type,对应操作fn
          if (_message[type]) {  //消息容器中有对应的type,直接往队列中添加
            _message[type].push(fn);
          } else {    //消息容器中没有对应的type,则先创建队列,再添加
            _message[type] = [];
            _message[type][0] = fn;
          }
        }, 
        publish: function (type) {
          if (_message[type]) {
            _message[type].forEach(item => {
              typeof item === 'function' && item();
            });
          }
        }
      }
    }());
    

    到这里,一个简单的订阅发布者模式构就建好了。

    测试

    Observe.register("SayHi", function () { console.log('Hi, I am the first.'); });
    Observe.register("SayHi", function () { console.log('Hi, I am the second.'); });
    Observe.register("SayHi", function () { console.log('Hi, I am the three.'); });
    Observe.register("SayHello", function () { console.log('Hello, I am the four.'); });
    Observe.publish("SayHi");
    //输出为
    //Hi, I am the first.
    //Hi, I am the second.
    //Hi, I am the three.
    

    相关文章

      网友评论

          本文标题:(6)JavaScript订阅发布者模式

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