国产探花免费观看_亚洲丰满少妇自慰呻吟_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);  })}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 富裕县| 苍梧县| 诸城市| 岳普湖县| 安福县| 神木县| 衡南县| 昔阳县| 荥阳市| 满洲里市| 阿坝县| 侯马市| 宁化县| 天长市| 同江市| 遂昌县| 当雄县| 措美县| 托里县| 宝坻区| 张掖市| 莆田市| 定襄县| 盖州市| 平乐县| 陕西省| 策勒县| 邹城市| 庆安县| 南丰县| 利辛县| 玉环县| 大厂| 六安市| 西吉县| 思南县| 全椒县| 岳阳县| 新邵县| 保山市| 青海省|