【经验总结】简陋无比的观察者模式实现

说明:观察者模式超级简陋版,代码很简单

主要实现代码如下:

//简单的工具对象,实现了观察者模式所需的基本要素
var publisher = {

    whateverType: 'any',
    subscribers:{
        //'any': []    //当不指定订阅类型时,统统扔到这个默认的队列里去
    },

    //订阅事件,type:事件类型,handler:事件处理方法
    subscribe: function(type, handler){
        type = type || whateverType;
        if(typeof this.subscribers[type]==='undefined'){
            this.subscribers[type] = [];
        }
        this.subscribers[type].push(handler);
    },

    //停止订阅事件,type:事件类型,[handler]:事件处理方法(如不传,则将类型为type的事件订阅队列清空)
    unsubscribe: function(type, handler){
        type = type || whateverType;
        var subscribers = this.subscribers[type] || [];
        for(var i=0; i<subscribers.length; i++){
            if(!handler || subscribers[i]===handler){
                subscribers.splice(i, 1);
                i--;
            }
        }
    },

    //发布事件,type:事件类型,[param]:事件参数,格式可自行定义
    publish: function(type, param){
        type = type || whateverType;
        var subscribers = this.subscribers[type] || [];
        for(var i=0,len=subscribers.length; i<len; i++){
            subscribers[i](param);
        }
    }
};

 

接下来随便写两个对象,一个做发布者,一个做订阅者吧(一下子想到了老师给学生布置作业神马的。。。)

//工具函数,将source对象的属性拷贝到target里
function extend(target, source){
    for( var key in source) target[key] = source[key];
}

//仁慈的老师
var Teacher = {};
extend(Teacher, publisher);

//听话的学生
var Student = {
    doHomework: function(){
        console.log('homework, i wanna die');
    },
    takeExam: function(param){
        console.log('just '+ param.week_left +' weeks before final exams ! wtf');
    }
};

简单的测试用例,非详细:

Teacher.subscribe('homework', Student.doHomework);
Teacher.subscribe('exam', Student.takeExam);

Teacher.publish('homework');    //homework, i wanna die
Teacher.publish('exam', {week_left: 2});    //just 2 weeks before final exams ! wtf 

Teacher.unsubscribe('homework', Student.doHomework);

Teacher.publish('homework');
Teacher.publish('exam', {week_left: 2});    //just 2 weeks before final exams ! wtf

 

观察者模式的简陋实现,代码很简单,思路也不复杂,根据需要稍加修改应该就可以用到实际项目中去,对于项目模块的通信、解耦都有很大作用...省略n字...

时间: 2024-09-13 10:14:10

【经验总结】简陋无比的观察者模式实现的相关文章

一种奇葩精神:时空冲浪手

<时空冲浪手>试玩攻略<TimeSurfer>,中国区的名字叫做<时空冲浪手>,本周神奇周四神奇来袭的最非主流个性 跑酷游戏,没有你做不到,只有你想不到.游戏有着诡异的复古+迷幻风格,一般人难以模仿,在稍微有点雷人的同时,不能否认它其实做得还是比较好玩的. 游戏名称:<时空冲浪手>价格:6元发布时间:2013年1月9日大小:20.9 MB一进游戏标题就先被这张图片给雷傻了,这种浓浓的史诗级海报绘法,还有主人公略显奇葩的人设,总觉得来到了另一个世界.游戏主角具

1936年南京电话扩容至8100门

■第一个打电话的中国人是谁 ■民国电信话务科科长为何由军人来担任 ■蒋介石为啥一打电话就爱发脾气 1936年2月1日,<中央日报>刊登一则题为<首都电话局增装新机今日启用,城南旧机号码改五字头,改定营业价目今日实行>的新闻.这则新闻字数不多,但却引起了许多市民的关注.生活在国民政府首都的百姓,其视野相对其他地区自然比较开阔,但电话作为舶来品在当时确实还属稀罕之物,能装上电话的非富即贵.更何况,此次电话局增装新机,涉及电话号码改号.初装费和月租费调价等系列问题,不认真读读怎么行? 那

蚕豆网精品APP推荐第205期:视听体验

每日看酷闻,当日新鲜IT资讯全Hold住,移动互联耍酷玩Fashion尽在蚕豆!欢迎订阅 蚕豆网.[产品资讯] 价格低廉?iPad mini启用7.8超窄宽屏据可靠消息称,9月12日将会是iPhone的独秀,而iPad mini则会单独在10月份正式发布.之前有传言称,全新的iPad mini将会采用7.85英寸屏幕,像一个大号的iPod.据国外媒体phonearena报道,日前从国内电商淘宝网上以及一些模型制造商中获取了一些iPad mini新模型的实拍图.苹果iPad系列一直以来都是9.7英

网站视觉设计分析:频道改版方法和经验

文章描述:频道是一个与用户交流的平台,做到与用户的无障碍互动,不仅需在内容层面的体现,更重要的是体验上的感触,. 频道是产品的门户,用户的窗口,业务的平台, 随着平台上产品的发展,频道的改版那是必然的事情,每次改版的目标和方向都在发生变化,对于设计师而言就意味着又是一个新的产品设计,所以频道改版方法和经验一半靠前人总结,一半靠自己摸索: 一.新手误区:拿到交互demo就直接对交互稿进行视觉设计,当遇到某个版块放在这个位置不合适的情况下就会直接更改版块位置,发现色彩比较淡就会任意更换色彩或是添加新

[精华]web架构设计经验分享!

经验|经验分享|精华|设计|web架构 本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化 一的架构,希望设计出具有无比扩展

交互设计经验:设计过程中存在太多的矛盾

文章描述:交互设计经验:设计过程中存在太多的矛盾. 在产品团队中经常听到有人表态:"我们要做简洁的用户界面",同时又有另外一种声音传来:"我们要做功能强大的产品".乍一听,简洁意味着用户界面控件精炼,然而少数的交互方式如何表达各类强大的功能?反之,强大意味着功能丰富强劲,必然拥有错综复杂的联系,如何让其界面保持简洁?两者似乎无法共存,这让我突然想到自相矛盾的故事,楚国商人夸耀自己的矛锐利万分,同时自己的盾又坚固无比, "以子之矛,陷子之盾,何如?"

化妆品垂直类目NALA:NALA这两年发展的经验

文章描述:化妆品垂直类目NALA:NALA这两年发展的经验. 2009年5月开始,2年间,NALA已经从0做到了月销售额超过1500万,化妆品垂直类目的领先者之一.也是发展快速的典型代表. 2009年到2010年,从开始创业到成长,我的第一篇文章就发表在派代.期间有3篇文章成了热文后,我就没再写了.而后,也成了派代会议的多次嘉宾.我对派代和老邢充满感激.我希望我能够把经验写下来,更多的帮助更多像我两年前一样的人. 我亲身体验着理论和实践的真实过程,体验着各种各样的辛苦和努力,感觉到无比的幸运,也

Javascript设计模式:观察者模式

一直以来都想把在实际开发中的一些经验系统地整理一下,共享出来给一些有志于深入B/S开发的朋 友,趁着国庆忙里偷闲,先试验性的写一下有关于Javascript开发中的比较有用的东西. 设计模 式一直以来都是在面向对象的语言,或比较正规化的开发中才会出现的一门程序设计思想.一直以来众 多的前端开发者认为使用OO方式来写JS更像是一个程序开发者,殊不知一旦将这门脚本语言深入进去后 ,仅仅才是一个开始,设计模式仅能算是对程序设计深入了解的第一步. 为什么要用设计模式我 就不多说了,仁者见仁的问题,现在还

关于WebForms及一些ASP.NET开发上的经验(1)

记得数年前,当ASP.NET刚出现时,天下间Web开发框架中似乎出现了一个"巨人",WebForms这种似 乎人人都能掌握的开发框架几乎瞬间流行起来.如果谁还在用传统ASP这种控制与表现混合的开发方式, 似乎立即变得低俗了许多.于是乎许许多多人都学会了拖控件+绑定的方式,"Web开发人员"也越来越多 ,一片红火,好不热闹. 风水轮流转,不知从什么时候开始Rails框架随着RoR忽的流行了开来,.NET社区也出现了Monorail, 批判WebForms声音也慢慢多了