摘要:簡單的門面模式實(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 = 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)即可,該方法將所需的子方法進(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
摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個(gè)為例,說說實(shí)際應(yīng)用中的適配器模式的使用方法。而如果實(shí)現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對(duì)類的接口進(jìn)行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...
摘要:本書概括以軟件系統(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)...
摘要:如果為假值,不傳或者傳入,函數(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...
摘要:三種使用構(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&...
摘要:繼承的是超類型中構(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è)引用...
閱讀 1705·2021-09-26 10:00
閱讀 2961·2021-09-06 15:00
閱讀 3575·2021-09-04 16:40
閱讀 2346·2019-08-30 15:44
閱讀 744·2019-08-30 10:59
閱讀 1918·2019-08-29 18:34
閱讀 3641·2019-08-29 15:42
閱讀 2316·2019-08-29 15:36