摘要:簡單的門面模式實例事件綁定函數(shù)門面模式的作用是將復(fù)雜的接口進行包裝,變成一個便于使用的接口。還是以事件相關(guān)為例,事件綁定中還有兩個常用的分別是和。
門面模式是什么,與其我去用笨拙的語言去解釋,不如看下面這張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說的是一位兒子為他的爸媽設(shè)置的電腦桌面。
有了這些起好名字的快捷方式,身為電腦盲的爸媽就不需要去了解何為瀏覽器,何為播放器了,照著指示點就是了。這些快捷方式相當(dāng)于在用戶和計算機程序之間架起了一座橋梁,不需要每個用戶都像電影里的黑客一樣敲著一行行的代碼才能使用計算機的功能。這就是門面模式的意義——把復(fù)雜的功能(接口)經(jīng)過包裝,讓用戶(開發(fā)者)能間接地,比較簡單地去使用(調(diào)用)它們,簡化使用(開發(fā))的難度。
簡單的門面模式實例——事件綁定函數(shù)門面模式的作用是將復(fù)雜的接口進行包裝,變成一個便于使用的接口。在很多的JavaScript庫中都能找到門面模式的應(yīng)用,例如jQuery,我們在用jQuery進行事件綁定的時候,簡單的調(diào)用bind(),on()等方法就可以了,并不用對不同瀏覽器的兼容性問題進行處理,兼容性的處理在jQuery內(nèi)部已經(jīng)完成,就是通過門面的思想。
我們就以事件綁定為例,來展現(xiàn)一下門面模式是什么:
// 實現(xiàn)一個通用的,跨多種瀏覽器的時間綁定函數(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; } }
通過能力檢測,對瀏覽器支持的API進行判斷,自動調(diào)用有效的事件綁定API來綁定時間。開發(fā)者在綁定時間的時候,就不需要寫冗長的判斷代碼,直接專注于業(yè)務(wù)就好,這是門面模式帶來的最直接的便利。
這里門面模式的作用是處理瀏覽器的兼容性,門面模式的另一個作用是對多個函數(shù)進行組合管理。
還是以事件相關(guān)API為例,事件綁定中還有兩個常用的API分別是event.stopPropagation()和event.preventDefault()。這兩個API在IE瀏覽器中是不兼容的,在IE中它們分別對應(yīng)的是event.cancelBubble = true和event.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)即可,該方法將所需的子方法進行了包裝,也處理了兼容性問題。
門面模式在模塊中的應(yīng)用結(jié)合以前說過的對象創(chuàng)建模式,門面模式可以應(yīng)用在模塊之中,通過對私用方法的包裝提供簡化的公用方法,開發(fā)者維護模塊時只需修改私用方法就可以調(diào)整公用方法的實現(xiàn)。
var orange = (function() { // 私用方法包裝對象 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(); } } })();
門面模式能提供編寫方式的靈活性,通過對底層子方法的封裝,既簡化了代碼又降低了對底層系統(tǒng)的耦合。在大型系統(tǒng)工具庫的使用中有重要的意義。但在實際項目中還是要考慮代碼量的輕便性,如果業(yè)務(wù)只需要一些小粒度的方法的話,就沒有必要使用包裝了很多無用方法的門面函數(shù)了,這需要開發(fā)者靈活判斷。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78082.html
摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應(yīng)用中的適配器模式的使用方法。而如果實現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...
摘要:本書概括以軟件系統(tǒng)為例,重點講解了應(yīng)用架構(gòu)中的物理設(shè)計問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。容器獨立模塊不依賴于具體容器,采用輕量級容器,如獨立部署模塊可獨立部署可用性模式發(fā)布接口暴露外部配置使用獨立的配置文件用于不同的上下文。 本文為讀書筆記,對書中內(nèi)容進行重點概括,并將書中的模塊化結(jié)合微服務(wù)、Java9 Jigsaw談?wù)劺斫狻?本書概括 以Java軟件系統(tǒng)為例,重點講解了應(yīng)用架構(gòu)...
摘要:如果為假值,不傳或者傳入,函數(shù)都會返回但是,傳入這個值是完全有可能的,所以這種判斷形勢是不正確的或者使用來判斷也可以原始類型優(yōu)于封裝類型對象擁有六個原始值基本類型布爾值,數(shù)字,字符串,,和對象。 作為一個前端新人,多讀書讀好書,夯實基礎(chǔ)是十分重要的,正如蓋樓房一樣,底層穩(wěn)固了,才能越壘越高。從開始學(xué)習(xí)到現(xiàn)在,基礎(chǔ)的讀了紅寶書《JavaScript高級程序設(shè)計》,犀牛書《JavaScri...
摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對象的方法和的作用都是在某個特殊對象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無區(qū)別適用情境可以在特殊的情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會有很多重復(fù)代碼,在此基礎(chǔ)上改進showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
摘要:繼承的是超類型中構(gòu)造函數(shù)中的屬性,如上繼承了屬性,但沒有繼承原型中的方法。上述造成的結(jié)果是子類型實例中有兩組超類型的構(gòu)造函數(shù)中定義的屬性,一組在子類型的實例中,一組在子類型實例的原型中。 ECMAScript只支持實現(xiàn)繼承,主要依靠原型鏈來實現(xiàn)。與實現(xiàn)繼承對應(yīng)的是接口繼承,由于script中函數(shù)沒有簽名,所以無法實現(xiàn)接口繼承。 一、原型鏈 基本思想:利用原型讓一個引用類型繼承另一個引用...
閱讀 1681·2021-09-26 10:00
閱讀 2941·2021-09-06 15:00
閱讀 3548·2021-09-04 16:40
閱讀 2313·2019-08-30 15:44
閱讀 724·2019-08-30 10:59
閱讀 1892·2019-08-29 18:34
閱讀 3626·2019-08-29 15:42
閱讀 2301·2019-08-29 15:36