成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 設(shè)計(jì)模式讀書筆記(六)——門面模式

pubdreamcc / 2278人閱讀

摘要:簡單的門面模式實(shí)例事件綁定函數(shù)門面模式的作用是將復(fù)雜的接口進(jìn)行包裝,變成一個(gè)便于使用的接口。還是以事件相關(guān)為例,事件綁定中還有兩個(gè)常用的分別是和。

門面模式是什么,與其我去用笨拙的語言去解釋,不如看下面這張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說的是一位兒子為他的爸媽設(shè)置的電腦桌面。

有了這些起好名字的快捷方式,身為電腦盲的爸媽就不需要去了解何為瀏覽器,何為播放器了,照著指示點(diǎn)就是了。這些快捷方式相當(dāng)于在用戶和計(jì)算機(jī)程序之間架起了一座橋梁,不需要每個(gè)用戶都像電影里的黑客一樣敲著一行行的代碼才能使用計(jì)算機(jī)的功能。這就是門面模式的意義——把復(fù)雜的功能(接口)經(jīng)過包裝,讓用戶(開發(fā)者)能間接地,比較簡單地去使用(調(diào)用)它們,簡化使用(開發(fā))的難度。

簡單的門面模式實(shí)例——事件綁定函數(shù)

門面模式的作用是將復(fù)雜的接口進(jìn)行包裝,變成一個(gè)便于使用的接口。在很多的JavaScript庫中都能找到門面模式的應(yīng)用,例如jQuery,我們?cè)谟胘Query進(jìn)行事件綁定的時(shí)候,簡單的調(diào)用bind(),on()等方法就可以了,并不用對(duì)不同瀏覽器的兼容性問題進(jìn)行處理,兼容性的處理在jQuery內(nèi)部已經(jīng)完成,就是通過門面的思想。

我們就以事件綁定為例,來展現(xiàn)一下門面模式是什么:

// 實(shí)現(xiàn)一個(gè)通用的,跨多種瀏覽器的時(shí)間綁定函數(shù)
function addEvent(el, type, fn) {
  if (window.addEventListener) {
    el.addEventListener(type, fn, false);
  } else if (window.attachEvent) {
    el.attachEvent("on" + type, fn);
  } else {
    el["on" + type] = fn;
  }
}

通過能力檢測(cè),對(duì)瀏覽器支持的API進(jìn)行判斷,自動(dòng)調(diào)用有效的事件綁定API來綁定時(shí)間。開發(fā)者在綁定時(shí)間的時(shí)候,就不需要寫冗長的判斷代碼,直接專注于業(yè)務(wù)就好,這是門面模式帶來的最直接的便利。

這里門面模式的作用是處理瀏覽器的兼容性,門面模式的另一個(gè)作用是對(duì)多個(gè)函數(shù)進(jìn)行組合管理。

還是以事件相關(guān)API為例,事件綁定中還有兩個(gè)常用的API分別是event.stopPropagation()event.preventDefault()。這兩個(gè)API在IE瀏覽器中是不兼容的,在IE中它們分別對(duì)應(yīng)的是event.cancelBubble = trueevent.returnValue = false。通過門面模式我們的目標(biāo)是:
沒有蛀牙~~~
以及:

+---------------+      +------------+      +--------------+      +-----------+
|stopPropagation|      |cancelBubble|      |preventDefault|      |returnValue|
+---------------+      +------------+      +--------------+      +-----------+
        |                    |                    |                        |
        +--------------------+                    +------------------------+
                   ↓                                          ↓
           +---------------+                           +--------------+
           |stopPropagation|                           |preventDefault|
           +---------------+                           +--------------+
                   |                wrapped in                 |
                   +-------------------------------------------+
                                        ↓
                          +-----------------------------+
                          |          ╭ stopPropagation |
                          | stopEvent                   |
                          |          ╰ preventDefault  |
                          +-----------------------------+

通過代碼事件就是這樣:

var eventUtil = {
  stopPropagation: function(ev) {
    if (ev.stopPropagation) {
      ev.stopPropagation();
    } else {
      ev.cancelBubble = true;
    }
  },
  preventDefault: function(ev) {
    if (ev.preventDefault) {
      ev.preventDefault();
    } else {
      ev.returnValue = false;
    }
  },
  stopEvent: function(ev) {
    eventUtil.stopPropagation(ev);
    eventUtil.preventDefault(ev);
  }
}

這樣,在事件綁定函數(shù)中,如果需要取消冒泡和默認(rèn)事件的話,直接調(diào)用eventUtil.stopEvent(ev)即可,該方法將所需的子方法進(jìn)行了包裝,也處理了兼容性問題。

門面模式在模塊中的應(yīng)用

結(jié)合以前說過的對(duì)象創(chuàng)建模式,門面模式可以應(yīng)用在模塊之中,通過對(duì)私用方法的包裝提供簡化的公用方法,開發(fā)者維護(hù)模塊時(shí)只需修改私用方法就可以調(diào)整公用方法的實(shí)現(xiàn)。

var orange = (function() {
  // 私用方法包裝對(duì)象
  var _privateMethod = {
    orangeValue: 10,
    getValue: function() {
      console.log(this.orangeValue);
    },
    setValue: function(value) {
      this.orangeValue = value;
    }
  }

  // 返回公用方法
  return {
    setOrangeValue: function(value) {
      _privateMethod.setValue(value);
      _privateMethod.getValue();
    }
  }
})();

門面模式能提供編寫方式的靈活性,通過對(duì)底層子方法的封裝,既簡化了代碼又降低了對(duì)底層系統(tǒng)的耦合。在大型系統(tǒng)工具庫的使用中有重要的意義。但在實(shí)際項(xiàng)目中還是要考慮代碼量的輕便性,如果業(yè)務(wù)只需要一些小粒度的方法的話,就沒有必要使用包裝了很多無用方法的門面函數(shù)了,這需要開發(fā)者靈活判斷。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78082.html

相關(guān)文章

  • JavaScript 設(shè)計(jì)模式讀書筆記(七)——適配器模式

    摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個(gè)為例,說說實(shí)際應(yīng)用中的適配器模式的使用方法。而如果實(shí)現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對(duì)類的接口進(jìn)行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...

    AZmake 評(píng)論0 收藏0
  • 《Java應(yīng)用架構(gòu)設(shè)計(jì):模塊化模式與OSGi》讀書筆記

    摘要:本書概括以軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)中的物理設(shè)計(jì)問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。容器獨(dú)立模塊不依賴于具體容器,采用輕量級(jí)容器,如獨(dú)立部署模塊可獨(dú)立部署可用性模式發(fā)布接口暴露外部配置使用獨(dú)立的配置文件用于不同的上下文。 本文為讀書筆記,對(duì)書中內(nèi)容進(jìn)行重點(diǎn)概括,并將書中的模塊化結(jié)合微服務(wù)、Java9 Jigsaw談?wù)劺斫狻?本書概括 以Java軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)...

    seanHai 評(píng)論0 收藏0
  • Effective JavaScript讀書筆記(一)

    摘要:如果為假值,不傳或者傳入,函數(shù)都會(huì)返回但是,傳入這個(gè)值是完全有可能的,所以這種判斷形勢(shì)是不正確的或者使用來判斷也可以原始類型優(yōu)于封裝類型對(duì)象擁有六個(gè)原始值基本類型布爾值,數(shù)字,字符串,,和對(duì)象。 作為一個(gè)前端新人,多讀書讀好書,夯實(shí)基礎(chǔ)是十分重要的,正如蓋樓房一樣,底層穩(wěn)固了,才能越壘越高。從開始學(xué)習(xí)到現(xiàn)在,基礎(chǔ)的讀了紅寶書《JavaScript高級(jí)程序設(shè)計(jì)》,犀牛書《JavaScri...

    zhoutao 評(píng)論0 收藏0
  • javascript高級(jí)程序設(shè)計(jì)》第讀書筆記javascript對(duì)象的幾種創(chuàng)建方式

    摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對(duì)象的方法和的作用都是在某個(gè)特殊對(duì)象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無區(qū)別適用情境可以在特殊的情況下用來為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會(huì)有很多重復(fù)代碼,在此基礎(chǔ)上改進(jìn)showImg(https://segmentfault.com/img/bVbmKxb?w=456&...

    xiaotianyi 評(píng)論0 收藏0
  • javascript高級(jí)程序設(shè)計(jì)》第讀書筆記javascript繼承的6種方法

    摘要:繼承的是超類型中構(gòu)造函數(shù)中的屬性,如上繼承了屬性,但沒有繼承原型中的方法。上述造成的結(jié)果是子類型實(shí)例中有兩組超類型的構(gòu)造函數(shù)中定義的屬性,一組在子類型的實(shí)例中,一組在子類型實(shí)例的原型中。 ECMAScript只支持實(shí)現(xiàn)繼承,主要依靠原型鏈來實(shí)現(xiàn)。與實(shí)現(xiàn)繼承對(duì)應(yīng)的是接口繼承,由于script中函數(shù)沒有簽名,所以無法實(shí)現(xiàn)接口繼承。 一、原型鏈 基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)引用...

    孫吉亮 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<