JS 设计模式八 -- 发布订阅者模式
概念
发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。
优点
1、支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象。
2、发布者与订阅者耦合性降低
缺点
创建订阅者需要消耗一定的时间和内存。
如果过度使用的话,反而使代码不好理解及代码不好维护。
代码实现
var Event = (function(){ var list = {}, // 缓存订阅者列表 listen, // 订阅 trigger, // 发布订阅 remove; // 移除订阅 listen = function(key,fn){ if(!list[key]) { list[key] = []; } list[key].push(fn); }; trigger = function(){ var key = Array.prototype.shift.call(arguments), fns = list[key]; if(!fns || fns.length === 0) { return false; } for(var i = 0, fn; fn = fns[i++];) { fn.apply(this,arguments); } }; remove = function(key,fn){ var fns = list[key]; if(!fns) { return false; } if(!fn) { fns && (fns.length = 0); }else { for(var i = fns.length - 1; i >= 0; i--){ var _fn = fns[i]; if(_fn === fn) { fns.splice(i,1); } } } }; return { listen: listen, trigger: trigger, remove: remove } })(); // 订阅: Event.listen("color",function(size) { console.log("尺码为:"+size); // 打印出尺码为42 });
// 发布 Event.trigger("color",42);