观察者模式
汉语描述:授人与柄,两个对象想互相操作,最简单的 就是拿到对方的柄(也可以叫引用或者指针),类似于链表结构,要点在于互相授人与柄。java可以创建接口来强约束,js可以自己写函数来实现观察者接口,嗯JS是个灵活的小胖子。
var source ={//数据源对象
regList:[],//存放柄对象的数据结构
/**
注册列表数据结构如果是数组,只能做到全体通知执行。
如果是{{type:[注册的组件数组...]}},可以分类进行通知执行,不同的数据结构不同的玩儿法
**/
msg:‘‘,
isChange:false,
reg:function(obj){
regList.add(obj);
},
setMsg:function(msg){//设置改变 同时通知观察者
isChange=true;//设置状态改变
for(var i in regList){
regList[i].callBack(this,msg);
}
isChange=false;//清除状态标记
},
getMsg:function(){//拉消息的方式
return this.msg;
}
}
var disaplay ={//显示器 可以改成prototype的方式 把通用方法写到原型上 然后把各自的show方法写到自身对象上
source:null,
show:function(msg){//这里写通知后的逻辑,可以抽离到各自的新观察者对象上
alert(msg);
},
callBack:function(obj,msg){//约定的回调接口因为JS没有像java一样强制的interface
show(msg);//推的方式
},
getChange:function(){
if(source.change){
var msg = source.getMsg();
alert(‘拉过来的消息‘+msg);
}
},
Make:function(source){//构造函数 将源对象的柄拿过来
var obj = new watcher();
obj.source = source;
source.reg(this)
return obj;
}
}
//以上类已经构造完毕
//下面写注册调用
var disaplay1 = watcher.Make(source);
disaplay1.show=function(msg){
alert("有气无力的告诉你们"+msg);
}
var disaplay2 = watcher.Make(source);
disaplay2.show=function(msg){
alert("郑重的告诉你们"+msg);
}
source.setMsg(‘通知你们去食堂吃饭‘);
原文:http://www.cnblogs.com/xiaolong1985/p/6437739.html