发布/ 订阅(Pub/Sub)是,它有两个参与者:发布者和订阅者。发布者向某个信道(channel)发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会接收到一个通知。最重要的一点是,发布者和订阅者是完全解耦的,彼此并不知晓对方的存在一种消息模式。
两者仅仅共享一个信道名称。发布者和订阅者的解耦可以让你的应用易于扩展,而不必引入额外的交叉依赖和耦合,从而提高了应用的可维护性,添加额外功能也非常容易。那么,应当如何在应用中使用发布/ 订阅(Pub/Sub)模式呢?你只需记录回调和事件名称的对应关系及调用它们的方法。看一下这个例子,这段代码中实现了PubSub 对象,用它可以添加并触发事件监听:
var PubSub={
subscribe:function(ev,callback){
//创建_callback对象,除非已经存在
var calls=this._callback||(this._callback={ });
//针对给定的事件key创建一个数组,除非这个数组已经存在
//返回回调函数追加到这个数组中
(this._callback[ev]|| (this._callback[ev]=[ ]) ).push[callback];
return this;
},
publish:function(){
//将arguments对象转换为真正的数组
var args=Array.prototype.slice.call(arguments,0);
//取得第一个参数(事件名)
var ev=args.shift();
//如果不存在_callback对象,则返回
//或者如果不包括给定事件对应的数组
var list ,calls
if(!(calls==this._callback)) return this;
if(!(list==this._callsback[ev])) return this;
//触发回调
for(var i=0;i<list.length;i++){
list[i].apply(this,args);
return this;
}
};