目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新接口。具體觀察者和具體目標繼承各自的基類,而後具體觀察者把本身註冊到具體目標裏,在具體目標發生變化時候,調度觀察者的更新方法。javascript
function Observer(){
this.list = {};//保存全部觀察者方法的引用
}
//添加觀察者
Observer.prototype.addWatcher = function(type,func){
if(!(this.list[type] instanceof Array)){
this.list[type] = [];
}
this.list[type].push(func);
}
//發佈
Observer.prototype.fire = function(type){
var typeFunc = this.list[type];
var len = typeFunc.length;
for(var i = 0;i < len; i++){
typeFunc[i](event);
}
}
//移除觀察者
Observer.prototype.removeWatcher = function(type,func){
var typeFunc = this.list[type];
if(!(typeFunc instanceof Array)){
return;
}
var len = typeFunc.length;
for(var i = 0;i < len; i++){
if(typeFunc[i] == func){
typeFunc.splice(i,1);
}
}
}
複製代碼
訂閱者把本身想訂閱的事件註冊到調度中心,當該事件觸發時候,發佈者發佈該事件到調度中心(順帶上下文),由調度中心統一調度訂閱者註冊到調度中心的處理代java
function Publisher(){
this.subers = {};//存儲各種訂閱者
}
//添加發布者
Publisher.prototype.addSub = function(type,func){
if(!(subers[type] instanceof Array)){
subers[type] = [];
}
subers[type].push(func);
}
//移除發佈者
Publisher.prototype.removeSub = function(type,func){
var typeFunc = subers[type];
if(!(typeFunc instanceof Array)){
return;
}
var len = typeFunc.length;
for(var i = ;i < len; i++){
if(typeFunc[i] == func){
typeFunc.splice(i,1);
}
}
}
//發佈
Publisher.prototype.fire = function(type){
var typeFunc = subers[type];
var len = typeFunc.length;
for(var i = ;i < len; i++){
typeFunc[i](event);
}
}
function Subscriber(){
this.Publisher = new Publisher();
}
Subscriber.prototype.fire = function(type){
this.Publisher.fire(type);
}
複製代碼
上文能夠看出發佈/訂閱模式相對觀察者模式多了一箇中間過分把發佈和訂閱分開,若是從這點代碼量看來好像發佈訂閱徹底畫蛇添足,可是在大型項目中的團隊合做來講,徹底解耦是十分有必要的。ui