外觀/門面模式(Facade)


Facade Pattern 國內有些書譯為門面模式,如「Java與模式」,「JavaScript設計模式」。有些則譯為外觀模式,如「設計模式:可復用面向對象軟件的基礎」,「Java設計模式」。這里使用名詞“外觀模式”。

 

外觀模式屬於接口型模式,它提供一個更方便,高層接口,使用一致性的界面使得API更加容易使用。它有兩個作用:

  1. 簡化復雜接口
  2. 解耦和,屏蔽客戶端對子系統的直接訪問

 

外觀模式在JavaScript中被眾多類庫頻繁使用。由於早期各瀏覽器提供的API差異性較大,類庫的基本作用之一是掃平這些凹凸不平,提供統一接口供前端工程師使用。使用外觀模式,我們可以間接地與一個復雜子系統打交道,與直接訪問相比耦合性更低,更不易出錯。

 

比如添加事件標准瀏覽器使用addEventListener,舊版本IE使用attachEvent,可能自己需要封裝一個addEvent函數,這個addEvent函數就是一個門面。

function addEvent(el, type, fn) {
    if (el.addEventListener) {
        el.addEventListener(type, fn, false)
    } else if (el.attachEvent) {
        el.attachEvent('on' + type, fn)
    } else {
        el['on' + type] = fn
    }
}

實際就是將兩個不同的函數放到自己定義的函數里,之后使用該函數完成特定功能而不再使用有差異性的函數。

 

又如處理DOM事件時,有時會同時使用以下方法

e.stopPropagation()
e.preventDefault()

可以使用外觀模式創建一個新方法stop同時調用這兩個方法

function stop(e) {
	e.stopPropagation()
	e.preventDefault()   
}

 

jQuery中大量使用外觀模式,比如數據緩存模塊,內部internalData,internalRemoveData是低級API,實現核心功能,外部提供了data,removeData這兩個高級API供客戶端程序員使用。

事件模塊也是如此,內部有jQuery.event.add,jQuery.event.remove,jQuery.event.trigger等低級API,向外提供了on/bind,off/unbind,trigger等高級API,甚至再利用on又提供了.click/.dblclick/mouseover/mousedown等更快捷的添加事件API。

Ajax模塊也是外觀模式的典型例子,jQuery提供了一個基本的,低級接口$.ajax方法,通過封裝$.ajax產生了一些便利函數$.get, $.post。再通過封裝$.get又產生了$.getJSON,$.getScript等更高級的方法。

 

jQuery里的事件模塊和Ajax模塊可以說是外觀模式在JS中的經典應用。

 

適用場合

對於那些反復同時出現的代碼,如函數a和b多次同時出現在代碼中,應考慮將a,b組合起來放到一個新函數中。

 

之利

簡化了一些復雜接口(如$.ajax, $.event.add),清除不再需要的大對象以及提供一種更加單一,便利的方式展現接口功能。編寫一次組合代碼,就可以反復使用它,節省了代碼量,時間和精力。它還提供了較高層的功能,抽象,降低客戶端代碼對底層接口的耦合。如$.getJSON,通過$.ajax方法也可以得到相同的效果。但每次都需要配置相同的參數,如果獲取JSON的需求很頻繁,頁面中的相同的代碼就需要寫很多次。而封裝一次$.getJSON,之后就少寫很多代碼,且該方法更直觀。

 

之弊

外觀模式並非必不可少,同樣的功能不使用它也能完成功能。如不使用$.getJSON,通過$.ajax方法也可以得到相同的效果。此外由於增加了一層閉包,性能會有一定降低。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM