Javascript观察者模式

如果想让多个对象都具有观察者发布订阅的功能,我们可以定义一个通用的函数,然后将该函数的功能应用到需要观察者功能的对象上,代码如下:

var observer = {
	//订阅
	addSubscriber: function(callback) {
		this.subscriber[this.subscriber.length] = callback;
	},
	//发布
	publish: function(what) {
		for(var i = 0; i < this.subscriber.length; i++) {
			if(typeof this.subscriber[i] == 'function') {
				this.subscriber[i](what);
			}

		}
	},
	//取消发布
	removeSubscriber: function(callback) {
		for(var i = 0; i < this.subscriber.length; i++) {
			if(this.subscriber[i] == callback) {
				delete this.subscriber[i];
			}
		}
	},
	//将对象o具有观察者功能,注入
	make: function(o) {
		for(var i in this) {
			o[i] = this[i];
		}
		o['subscriber']=[];

	}
}

然后订阅1个对象blogger,使用observer.make方法将这个对象具有观察者功能,代码如下:

var blogger = {
	recommend: function(id) {
		var msg = "dudu推荐了帖子" + id;
		this.publish(msg);
	}
};
//---设置发布者
observer.make(blogger);

我们来看看make后的blogger

输入图片说明

那么这里的blogger里面就注入了observer对象里面的方法。

使用方法就比较简单了,订阅不同的回调函数,以便可以注册到不同的观察者对象里(也可以同时注册到多个观察者对象里):

//------------------------------订阅者
var tom = {
	read: function(what) {
		console.log('tom看见了:' + what);
	}
}
var mm = {
	show: function(id) {
		var msg = 'mm看见了:' + id;
		console.log(msg);
	}
}
//------------添加订阅者
blogger.addSubscriber(tom.read);
blogger.addSubscriber(mm.show);
//-----------发布
blogger.recommend(12); //调用发布
//-----------取消订阅
console.log('mm取消订阅');
blogger.removeSubscriber(mm.show);
//-----------发布
blogger.recommend(34);//调用发布

那么结果就是这样: 订阅了的订阅者都能收到发布者发布的信息

输入图片说明

转载于:https://my.oschina.net/u/1271438/blog/784668

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值