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()