/**
* 发布订阅者模式。
*
* 故事: 我和小芳去买房。
*
* @class Publish
*/
// ================================ 我和小芳同时订阅这家房地产 ===================================
class Publish {
constructor(){
this.home = [];
}
// 订阅
listen(fn){
this.home.push(fn);
}
// 发布
trigger(){
this.home.forEach(element => {
element.apply(this,arguments);
});
}
}
const ob = new Publish();
// 我订阅
ob.listen(function(...arg){
console.log('me:',arg);
});
// 小芳订阅
ob.listen(function(...arg){
console.log('xiaofang:',arg);
});
ob.trigger('尊敬的先生,今天有128平米的房子,你有兴趣嘛!');
ob.trigger('尊敬的小芳,今天有128平米的房子,你有兴趣嘛!');
// ================================ 我和小芳只想收到自己订阅的消息 ===================================
class Publish {
constructor(){
this.home = [];
}
// 订阅
listen(key,fn){
if(!this.home[key]){
this.home[key] = [];
}
this.home[key].push(fn);
}
// 发布
trigger(){
const key = Array.prototype.shift.call(arguments),fns = this.home[key];
if(!fns || fns.length === 0){
return false;
}
fns.forEach(element => {
element.apply(this,arguments);
});
}
// 移除
remove(key,fn){
const fns = this.home[key];
if(!fns){
return false;
}
this.home[key] =[];
fn(this.home[key]);
}
}
const ob = new Publish();
// 我订阅
ob.listen('88',function(...arg){
console.log('me:',arg);
});
// 小芳订阅
ob.listen('99',function(...arg){
console.log('xiaofang:',arg);
});
ob.remove('88',function(e){
console.log(e);
});
ob.trigger('88','尊敬的先生,今天有128平米的房子,你有兴趣嘛!');
ob.trigger('88','尊敬的先生,今天有150平米的房子,你有兴趣嘛!');
ob.trigger('99','尊敬的小芳,今天有128平米的房子,你有兴趣嘛!');
网友评论