Skip to content

Instantly share code, notes, and snippets.

@zD98
Created March 14, 2016 01:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zD98/1b76ef093f4fe3e148dd to your computer and use it in GitHub Desktop.
Save zD98/1b76ef093f4fe3e148dd to your computer and use it in GitHub Desktop.

##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);

###分析 优点:从订阅者解耦发布者, 对系统不同部分解耦并提供很大的灵活性 缺点:由于解耦 当订阅者出现问题时, 发布者无法了解,很难跟踪依赖更新

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment