外觀模式(Facade)爲子系統中的一組接口提供了一個一致的界面,此模塊定義了一個高層接口,這個接口值得這一子系統更加容易使用。
外觀模式在JS中經常用於解決瀏覽器兼容性問題。html
外觀模式不只簡化類中的接口,並且對接口與調用者也進行了解耦。外觀模式常常被認爲開發者必備,它能夠將一些複雜操做封裝起來,並建立一個簡單的接口用於調用。
外觀模式常常被用於JavaScript類庫裏,經過它封裝一些接口用於兼容多瀏覽器,外觀模式可讓咱們間接調用子系統,從而避免因直接訪問子系統而產生沒必要要的錯誤。前端
外觀模式的優點是易於使用,並且自己也比較輕量級。但也有缺點 外觀模式被開發者連續使用時會產生必定的性能問題,由於在每次調用時都要檢測功能的可用性。
下面是一段未優化過的代碼,咱們使用了外觀模式經過檢測瀏覽器特性的方式來建立一個跨瀏覽器的使用方法。segmentfault
好比對document
對象添加click
事件的時候:設計模式
function addEvent(dom, type, fn) { if (dom.addEventListener) { // 支持DOM2級事件處理方法的瀏覽器 dom.addEventListener(type, fn, false) } else if (dom.attachEvent) { // 不支持DOM2級但支持attachEvent dom.attachEvent('on' + type, fn) } else { dom['on' + type] = fn // 都不支持的瀏覽器 } } const myInput = document.getElementById('myinput') addEvent(myInput, 'click', function() {console.log('綁定 click 事件')})
還能夠用來解決一些其餘的瀏覽器兼容性問題:瀏覽器
const getEvent = function(event) { // 獲取事件對象 return event || window.event // IE下window.event } const getTarget = function(event) { // 獲取事件元素 const event = getEvent(event) return event.target || event.srcElement // IE下event.srcElement } const preventDefault = function(event) { // 阻止默認事件 const event = getEvent(event) if (event.preventDefault) {event.preventDefault()} else {event.returnValue = false} // IE下 } const cancelBubble = function(event) { const event = getEvent(event) if (event.stopPropagation) {event.stopPropagation()} else {event.cancelBubble = true} // IE下 } document.onclick = function(e) { preventDefault(e) if (getTarget(e) !== document.getElementById('myinput')) {console.log('呵呵')} }
那麼什麼時候使用外觀模式呢?通常來講分三個階段:緩存
Facade
也是很是合適的,爲系統開發一個外觀Facade
類,爲設計粗糙和高度複雜的遺留代碼提供比較清晰的接口,讓新系統和Facade
對象交互,Facade
與遺留代碼交互全部的複雜工做。本文是系列文章,能夠相互參考印證,共同進步~微信
網上的帖子大多深淺不一,甚至有些先後矛盾,在下的文章都是學習過程當中的總結,若是發現錯誤,歡迎留言指出~dom
參考:
設計模式以外觀模式
《Javascript 設計模式》 - 張榮銘
PS:歡迎你們關注個人公衆號【前端下午茶】,一塊兒加油吧~函數
另外能夠加入「前端下午茶交流羣」微信羣,長按識別下面二維碼便可加我好友,備註加羣,我拉你入羣~性能