JavaScript观察者模式原理与用法实例详解

  

本文实例讲述了JavaScript观察者模式原理与用法。分享给大家供大家参考,具体如下:

  

<强>观察者模式
  强观察者模式又叫发布订阅模式(发布/订阅),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
  *它分为2个角色:(1)观察者(2)被观察者

  

*观察者模式的目的:对程序的内在变化进行观察,当其有变化的时候,你可以得知,并且可以做出相应的反应。
  现在我们通过一个需求来学习该模式:模拟订阅者和报社之间的关系

  

在这个过程中:实际的操作分为(推模式,拿模式)

  

(1)推送——在长连接技术
  (2)拿模式,在定时去后台去取得
  使用代码实现如下:
  (1)发布类
  

     //发布类   函数BusinessOne(名字){   this.name=名称;//订阅者集合   这一点。用户=new Array ();   }      

(2)扩展一个发布者的发布消息的方法(推模式)

     //发布者的发送消息的方法(推模式)   BusinessOne.prototype.delive=function(新闻){   var自我=;//给每一个订阅者发布消息   this.subscribers。forEach(函数(fn) {//调用接受者处理信息的函数   fn(新闻、自我);   })   }      

(3)扩展公共订阅的函数,和取消订阅的函数

  

订阅的函数:

        Function.prototype。订阅=函数(出版商){   var=这个;//一些访问数组度我型并且以参数的形式传回回调函数中//只要至少有一次返回是真的那么就一些是真实的   var alreadyExists=publisher.subscribers。一些(函数(el) {   如果(el==) {//处理不能重复订阅的功能   返回;   }   });//没用订阅你就可以订阅   如果(! alreadyExists) {   publisher.subscribers.push (,);   }   返回;   }      

取消的函数:

        Function.prototype。退订=函数(出版商){   var=这个;   publisher.subscribers=publisher.subscribers。过滤器(函数(el){//过滤的实质是返回除开与当前对象相等的其余所用的对象集合   如果(el !==) {   返回厄尔;   }   });   返回;   }      

(4)创建发布的实例
  

     //创建发布者的实例   var b1=new BusinessOne(“中央电视台”);   var b2=new BusinessOne(“中国国防部报社”);      

(5)发布部分

  

(5.1)使用门面模式,针对各浏览器的事件绑定兼容问题

        函数addEventFacade (el、类型、fn) {   如果(window.addEventListener) {//火狐   el.addEventListener(类型、fn);   }else if (window.attachEvent) {//使用是IE   el.attachEvent (“on”+类型、fn);   其他}{   el [“on”+类型]=fn;   }   }      

(5.2)创建主应用函数

        var inint=function () {//创建观察者   var pageOne=function(新闻){   . getelementbyid(“信息”)value=" https://www.yisu.com/zixun/我发现了:“+”(" +参数[1]. name + "]发来的信息——→“+新闻   };//订阅1   pageOne.subscribe (b1) .subscribe (b2);   addEventFacade (. getelementbyid(“中央电视台”),“点击”,函数(){   b1.delive (. getelementbyid (“cctvText”) value);   })//订阅2   addEventFacade (. getelementbyid (gfb)”,点击“,函数(){   b2.delive (. getelementbyid (“gfbText”) value);   })   }      

最后,订阅者界面

        & lt; body>   & lt; div id=" div01 "祝辞& lt;/div>   & lt;脚本type=" text/javascript " src=" https://www.yisu.com/zixun/observer.js "祝辞& lt;/script>   & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/CCTV发送" id=把胧印北?   & lt;输入类型="文本" id=癱ctvText”比;   & lt; br> & lt; br> & lt; br>   & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/国防部报社发送" id=癵fb”比;   & lt;输入类型="文本" id=癵fbText”比;   & lt; br> & lt; br> & lt; br>   & lt; textarea id="信息"关口==" 60 "行" 20 "祝辞& lt;/textarea>   & lt;脚本src=" https://www.yisu.com/zixun/Js/设计模式第三部分/观察者模式/lib.js”祝辞& lt;/script>   & lt;脚本src=" https://www.yisu.com/zixun/Js/设计模式第三部分/观察者模式/观察者模式. js”祝辞& lt;/script>   & lt;/body>

JavaScript观察者模式原理与用法实例详解