JavaScript观察者模式经典_javascript技巧

JavaScript观察者模式(经典)Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。Observer模式的概念Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对彖,自动刷新对彖状态。Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。Observer模式的角色:Subject(被观察者)被观察的对象。当需要被观察的状态发牛变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。ConereteSubject被观察者的具体实现。包含一些基木的屈性状态及其他操作。Observer(观察者)接口或抽彖类。当Subject的状态发主变化时,Observer对彖将通过一个callback函数得到通知。ConcreteObserver观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。观察者模式(又叫发布者-订阅者模式)应该是最常用的模式之一.在很多语言里都得到大量应用.包描我们平时接触的doin事件•也是js和doin之间实现的一种观察者模式.div.onclick=functionclick(){alert(”click,)}只要订阅了div的click事件.当点击div的时候,functionclick就会被触发.那么到底什么是观察者模式呢.先看看生活中的观察者模式。好莱坞有句名言.“不要给我打电话,我会给你打电话”・这句话就解释了一个观察者模式的來龙去脉。其中“我”是发布者,“你”是订阅者。再举个例子,我来公司而试的时候,完事Z后每个而试官都会对我说:“请留下你的联系方式,有消息我们会通知你”。在这里“我”是订阅者,面试官是发布者。所以我不用每天或者每小吋都去询问面试结果,通讯的主动权掌握在了面试官手上。而我只需要提供-个联系方式。观察者模式可以很好的实现2个模块之间的解耦。假如我正在一个团队里开发一个html5游戏.当游戏开始的时候,需要加载一些图片素材。加载好这些图片之后开始才执行游戏逻辑.假设这是一个需要多人合作的项目.我完成了Gamer和Map模块,而我的同事A写了一个图片加载器loadimage.loadimage的代码如下loadlmagc(imgAry,function(){Map.init();Gamer,init();})当图片加载好之后,再渲染地图,执行游戏逻辑•嗯,这个程序运行良好.突然有一天,我想起应该给游戏加上声音功能.我应该让图片加载器添上一行代码.loadimage(imgAry,function(){Map.init();Gamer・init();Sount.init();})可是写这个模块的同事A去了外地旅游.于是我打电话给他,喂.你的loadTmage函数在哪,我能不能改一下,改了之后有没有副作用.如你所想,各种不淡定的事发生了.如果当初我们能这样写呢:loadimage.listen("ready,,function(){Map.iniI();})loadlmagc.1istcn("ready',function(){Gamer・init();})loadTmage.1isten("ready',function(){Sount.init();})loadimage完成Z后,它根本不关心将来会发生什么,因为它的工作已经完成了.接下来它只要发布一个信号.loadTmage.trigger("ready,);那么监听了loadlmagc的'rcady,事件的对象都会收到通知.就像上个面试的例了•面试官根本不关心面试者们收到面试结果后会去哪吃饭.他只负责把面试者的简丿力搜集到一起.当而试结果岀来时照着简丿力上的电话挨个通知.说了这么多概念,来一个具体的实现.实现过程其实很简单.面试者把简历扔到一个盒子里,然后面试官在合适的吋机拿着盒子里的简历挨个打电话通知结果.Events=function(){varlisten,log,obj,one,remove,trigger,_this;obj二{};_this=this;listen=function(key,cvcntfn){//把简历扔盒子,key就是联系方式.varstack,_ref;//stack是盒子stack二(_ref二obj[key])!二null?_ref:obj[key]二[];returnstack,push(eventfn);};one=function(key,eventfn){remove(key);returnlisten(key,eventfn);};remove=function(key){varref;return(_ref=obj[key])!=null?_ref.length=0:void0;};~trigger=function(){//面试官打电话通知面试者varfn,stack,_i,_len,_ref,key;key=Array,prototype,shift.call(arguments);stack=(_ref=obj[key])!=null?_ref:obj[key]=[];for(_i=0,_len二stack.length;_i<_len;_i++){fn=stack[_i];if(fn.apply(_this,arguments)===false){returnfalse;}}return{listen:listen,one:one,remove:remove,trigger:trigger}}最后用观察者模式來做一个成人电视台的小应用.//订阅者varadultTv=Event();adultTv.listen("play,,function(data){alert("今天是谁的电影”+data,name);});//发布者adultTv・trigger(”play,,{"name':/麻生希'})

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?