Javascript中的发布订阅模式

Javascript中的Publish/Subscribe模式是一种比较经典的模式。消息的发送者叫做publisher,
publisher不关心是谁接收了信息,也不用知道是谁接收了消息,只要把信息发出去就可以了。消息的订阅者叫做subscriber,跟publisher类似,subsriber也只关心特定的频道,只接收相关频道的消息,对谁是publisher一无所知。

核心的代码如下:

//第一步创建构造函数
function PubSub() {
    this.topics = {};
}

//publish方法,可以接受两个参数,第一个参数是发布的频道,第二个是传给listener的参数
PubSub.prototype.publish = function(topic,info){
  if(!this.topics.hasOwnProperty(topic))  return;

  this.topics[topic].forEach(function(listener){
    listener(info == null ? {} : info);
  })
}

//subscribe方法接受两个参数,订阅的频道,和listener函数
PubSub.prototype.subscribe = function(topic,listener){
  if(!this.topics.hasOwnProperty(topic)) {
    this.topics[topic] = [];
  }

  if(typeof listener != 'function'){
    alert('无效的listener,必须是一个函数');
    return
  }

  var index = this.topics[topic].push(listener) - 1;

  //注意返回值是一个对象,提供了remove函数,可以用来删除订阅者
  var topics = this.topics;
  return {
    remove: function(){
      topics[topic].splice(index,1);
    }
  }
}

调用方法:

var pubsub = new PubSub();
var sub = pubsub.subscribe('haha',function(info){
  alert('订阅了haha'+info.hello)
})
pubsub.publish('haha',{hello:'world'})

//移除这个订阅者
sub.remove()