##Publish/Subscribe模式 ###Observer模式与PubSub模式区别
-> subject - publisher
| | |
|Subscribe | Fire Event ->Topic/Event Channel<-
| | | |
| | | Subscribe | FireEvent
|_Observer <- |_ _ _ Subscriber_ _ _|
###总结 1. 使用了一个主题/事件通道, 避免订阅者与发布者之间产生依赖关系
###例子 eg. var pubsub = {}; (function(q){
var topics = {},
subUid = -1;
//发布消息 传递参数
q.publish = function(topic, args){
if(!topics[topic]){
return;
}
var subscribers = topics[topic],
len = subscibers?subscribers.length:0;
while(len--){
var it = subscribers[len].it;
处理订阅者的回调函数
subscribers[len].func.apply(it,args);
}
}
//订阅消息, func回调函数, it调用函数的_this
q.subscriber = function(topic, func,it){
if(!topics[topic]) {
topics[topic] = [];
}
//token 订阅者标识.方便删除?
var token = (++subUid).toString();
topics[topic].push({
token:token,
func:func,
it:it?it:null
});
return token;
}
q.unsubscriber = function(token){
for(var key in topics){
if(topics[key]){
topics[key].forEach(function(topic, index, arr){
if(topic.token===token){
arr.splice(index,1);
return false;
}
})
}
}
}
})(pubsub);
###分析 优点:从订阅者解耦发布者, 对系统不同部分解耦并提供很大的灵活性 缺点:由于解耦 当订阅者出现问题时, 发布者无法了解,很难跟踪依赖更新