国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript設計模式之觀察者模式實例詳解

2024-05-06 15:43:14
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript設計模式之觀察者模式。分享給大家供大家參考,具體如下:

觀察者模式

觀察者模式又叫發布訂閱模式(Publish/Subscribe),它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生變化時就會通知所有的觀察者對象,使得它們能夠自動更新自己。

* 它分為2個角色:(1)觀察者  (2)被觀察者
* 觀察者模式的目的:對程序的內在變化進行觀察,當其有變化的時候,你可以得知,并且可以做出相應的反應。

現在我們通過一個需求來學習該模式:模擬訂閱者和報社之間的關系

在這個過程中:實際的操作分為(推模式,拿模式)

(1)推送-->長連接技術
(2)拿模式-->定時去后臺去取得

使用代碼實現如下:

(1)發布類

//發布類function BusinessOne(name){  this.name=name;  //訂閱者集合  this.subscribers=new Array();}

(2)擴展一個發布者的發布消息的方法(推模式)

//發布者的發送消息的方法(推模式)BusinessOne.prototype.delive=function (news) {  var self=this;  //給每一個訂閱者發布消息  this.subscribers.forEach(function (fn) {    //調用接受者處理信息的函數         fn(news,self);  })}

(3)擴展公共訂閱的函數,和取消訂閱的函數

訂閱的函數:

Function.prototype.subscribe=function (publisher) {  var that=this;  //some 訪問數組度i型并且以參數的形式傳回回調函數中  //只要至少有一次返回是true那么some就是true  var alreadyExists=publisher.subscribers.some(function (el) {    if(el==that){      //處理不能重復訂閱的功能      return ;    }  });  //沒用訂閱你就可以訂閱  if(!alreadyExists){    publisher.subscribers.push(that);  }  return this;}

取消的函數:

Function.prototype.unsubscribe =function (publisher) {  var that = this;  publisher.subscribers=publisher.subscribers.filter(function (el) {//過濾的實質是返回除開與當前對象相等的其余所用的對象集合    if(el!==that){      return el;    }  });  return this;}

(4)創建發布的實例

//創建發布者的實例var b1 = new BusinessOne("CCTV");var b2 = new BusinessOne("中國國防部報社");

(5)發布部分

(5.1)使用門面模式--針對各瀏覽器的事件綁定兼容問題

function addEventFacade(el,type,fn) {  if(window.addEventListener){    //firefox    el.addEventListener(type,fn);  }else if(window.attachEvent){    //使用是IE    el.attachEvent("on"+type,fn);  }else {    el["on"+type] = fn;  }}

(5.2)創建主應用函數

var inint=function () {  //創建觀察者  var pageOne=function (news) {    document.getElementById("info").value="我發現了: "+"["+arguments[1].name+"]發來的信息--->"+news  };  //訂閱1  pageOne.subscribe(b1).subscribe(b2);  addEventFacade(document.getElementById("cctv"),"click",function () {    b1.delive(document.getElementById("cctvText").value);  })  //訂閱2  addEventFacade(document.getElementById("gfb"),"click",function () {    b2.delive(document.getElementById("gfbText").value);  })}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 瑞昌市| 纳雍县| 雷波县| 富宁县| 九台市| 吕梁市| 襄汾县| 白山市| 高清| 钟山县| 沙洋县| 绥江县| 海安县| 松滋市| 南乐县| 江口县| 揭阳市| 武夷山市| 兰考县| 四会市| 揭东县| 新闻| 镇平县| 深州市| 白朗县| 临安市| 青川县| 柞水县| 顺平县| 高碑店市| 泽州县| 富阳市| 广平县| 营山县| 海阳市| 怀安县| 安泽县| 西乌珠穆沁旗| 镇雄县| 从江县| 吐鲁番市|