据说knockout就是用观察者模式的,嘻嘻。。。菜鸟傻笑
1.观察者模式是什么
又叫做发布者订阅者模式(publish/Subscribe),用来确定对象之间的一种一对多的依赖,让多个订阅者同时监听某一个发布者对象,当这个发布者对象的状态发生变化时就通知所有的订阅者,使他们能够自动更新自己。
2.代码举例
老实说自己还是没有完全吃透观察者模式,所以无法自助写出对应的代码,假如有幸您独到的文章,就移步到大叔处或alloyteam处吧,这个随笔就用来加深我的理解吧。
- var pubsub ={};
- (function(q){
- var topics ={},// 回调函数存放的数组
- subUid =-1;
- // 发布方法
- q.publish =function(topic, args){
- if(!topics[topic]){
- returnfalse;
- }
- setTimeout(function(){
- var subscribers = topics[topic],
- len = subscribers ? subscribers.length :0;
- while(len--){
- subscribers[len].func(topic, args);
- }
- },0);
- returntrue;
- };
- //订阅方法
- q.subscribe =function(topic, func){
- if(!topics[topic]){
- topics[topic]=[];
- }
- var token =(++subUid).toString();
- topics[topic].push({
- token: token,
- func: func
- });
- return token;
- };
- //退订方法
- q.unsubscribe =function(token){
- for(var m in topics){
- if(topics[m]){
- for(var i =0, j = topics[m].length; i < j; i++){
- if(topics[m][i].token === token){
- topics[m].splice(i,1);
- return token;
- }
- }
- }
- }
- returnfalse;
- };
- }(pubsub));
使用方式如下:
- //来,订阅一个
pubsub.subscribe('example1',function(topics, data){
console.log(topics +": "+ data);
});
//发布通知
pubsub.publish('example1','hello world!');
pubsub.publish('example1',['test','a','b','c']);
pubsub.publish('example1',[{'color':'blue'},{'text':'hello'}]);
3.个人理解
1.又成为发布者订阅者模式,用来确定对象之间的一对多的依赖;
2.当发布者的状态发生改变时,会通知所有的订阅者,使其随之更新;
3.就像一个报纸对应多个读者一样,当报社发布报纸后,很多读者就会收到报纸。