javascript设计模式-----观察者模式

一、观察者模式

javascript中所有的事件应用了此模式,此模式大大降低对象间的耦合,并且易于扩展。简单来说,其实现思路就是函数回调,由订阅者提供对应事件的处理函数,当发布者发布消息,就会调用事件处理队列中的函数。静态语言,用接口来实现不同事件和不同处理函数的对应。javascript动态语言直接用hash表,和函数传递。

实现:

			var publisher = {
				listeners:{
					'any':[]//事件类型:订阅者
				},
				//注册
				addListener:function(fn,type){
					type  = type || 'any';
					if(typeof this.listeners[type] === 'undefined'){
						this.listeners[type] = [];
					}
					this.listeners[type].push(fn);
				},
				//取消注册
				remove:function(type,fn){
					this.visitlisteners('remove',fn,type);
				},
				//发布信息
				publish:function(publication,type){
					this.visitlisteners('publish',publication,type);
				},
				//遍历某事件的订阅者
				visitlisteners:function(action,arg,type){
					var pubtype = type || 'any',
						listeners = this.listeners[pubtype],
						i,
						max = listeners.length;
						
					for (i=0;i<max;i++) {
						if(action === 'publish'){
							//执行订阅者方法
							listeners[i](arg);
						}else{
							//取消订阅
							if(listeners[i] === arg){
								listeners.splice(i,1);
							}
						}
					}
				}
			}
			
			function makePublisher(o){
				var i;
				for(i in publisher){
					if(publisher.hasOwnProperty(i) && typeof publisher[i] === 'function'){
						o[i] = publisher[i];
					}
				}
				
				o.listeners = {any:[]};
			}
			
			//测试
			//发布者
			var paper  = {
				daily:function(){
					this.publish('aaaaaaaaaaaaaaa');
				},
				monthly:function(){
					this.publish('bbbbbbbbbbbbbbb','monthly');
				}
			}
			makePublisher(paper);
			
			//订阅者
			var joe = {
				drinkCoffee:function(paper){
					console.log('just read '+ paper);
				},
				sundayPreNap: function(monthly){
					console.log('ablout to fall asleep read ' +monthly);
				}
			}
			//注册
			paper.addListener(joe.drinkCoffee);
			paper.addListener(joe.sundayPreNap,'monthly');

			//发布信息
			paper.daily();//just read aaaaaaaaaaaaaaa  结果
			paper.daily();//just read aaaaaaaaaaaaaaa 
			paper.daily();//just read aaaaaaaaaaaaaaa 
			paper.monthly();//ablout to fall asleep read 



1.有一个'any'的事件类型,用于处理没有对应事件名字的事件函数。

2.此实现可以将任意对象变成发布者,利用makePublisher()函数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值