key words: 門面模式 facade模式
一、 引子
門面模式是非常簡單的設計模式。
?
二、 定義與結構
門面模式( facade )又稱外觀模式。 GOF 在《設計模式》一書中給出如下定義:為子系統中的一組接口提供一個一致的界面, Facade 模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
定義中提到的子系統是指在設計中為了降低復雜性根據一定的規則(比如業務、功能),對系統進行的劃分。子系統中封裝有一些類。客戶程序在使用子系統的時候,可能會像下圖一樣零亂。
在上面的實現方法中,客戶類緊緊地依賴在子系統的實現上。子系統發生的變化,很可能要影響到客戶類的調用。而且子系統在不斷優化、可重用化的重構路上,會產生更多更小的類。這對使用子系統的客戶類來說要完成一個工作流程,似乎要記住的接口太多了。
門面模式就是為了解決這種問題而產生的。看看使用了門面模式后的圖:
這樣就減少了客戶程序和子系統之間的耦合,增加了可維護性。
很明顯,門面模式有三個角色組成:
1) ??????? 門面角色( facade ):這是門面模式的核心。它被客戶角色調用,因此它熟悉子系統的功能。它內部根據客戶角色已有的需求預定了幾種功能組合。
2) ??????? 子系統角色:實現了子系統的功能。對它而言, fa?ade 角色就和客戶角色一樣是未知的,它沒有任何 fa?ade 角色的信息和鏈接。
3) ??????? 客戶角色:調用 fa?ade 角色來完成要得到的功能。
?
?
? ?
三、 舉例
Facade 一個典型應用就是進行數據庫連接。一般我們在每一次對數據庫進行訪問,都要進行以下操作:先得到 connect 實例,然后打開 connect 獲得連接,得到一個 statement ,執行 sql 語句進行查詢,得到查詢結果集。
?????? 我們可以將這些步驟提取出來,封裝在一個類里面。這樣,每次執行數據庫訪問只需要將必要的參數傳遞到這個類中就可以了。
?????? 有興趣可以在你正在進行的系統中實現一下。
?
?
? ?
四、 使用環境和優點
《設計模式》給出了門面模式的使用環境:
1) ??????? 當你要為一個復雜子系統提供一個簡單接口時。在上面已經描述了原因。
2) ??????? 客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入 facade 將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性(上面也提到了)。
3) ??????? 當你需要構建一個層次結構的子系統時,使用 facade 模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過 facade 進行通訊,從而簡化了它們之間的依賴關系。
以下是它的優點:
1) ??????? 它對客戶屏蔽子系統組件,因而減少了客戶處理的對象的數目并使得子系統使用起來更加方便。
2) ??????? 它實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件往往是緊耦合的。松耦合關系使得子系統的組件變化不會影響到它的客戶。 Facade 模式有助于建立層次結構系統,也有助于對對象之間的依賴關系分層。 Facade 模式可以消除復雜的循環依賴關系。這一點在客戶程序與子系統是分別實現的時候尤為重要。在大型軟件系統中降低編譯依賴性至關重要。在子系統類改變時,希望盡量減少重編譯工作以節省時間。用 Facade 可以降低編譯依賴性,限制重要系統中較小的變化所需的重編譯工作。 Facade 模式同樣也有利于簡化系統在不同平臺之間的移植過程,因為編譯一個子系統一般不需要編譯所有其他的子系統。
3) ??????? 如果應用需要,它并不限制它們使用子系統類。因此你可以讓客戶程序在系統易用性和通用性之間加以選擇。
?
?
? 五、 java 中的門面模式
先來想想門面模式和我們已經講過的哪個模式相像?答案就是 抽象工廠 模式 。兩者雖然在分類上有所區別,但是都是為了方便客戶程序的使用而建立。兩者的不同應該在于門面模式不僅方便了客戶的使用,而且隱藏了不該讓客戶知道的類(這些類僅僅為子系統的其他類服務)。
但是在 java 語言中提供的包的概念已經能夠很好的解決上面門面模式提到的問題。你可以把一個子系統放在一個包里面,里面要提供給外面訪問的類定義為 public ,而不該公布的類就可以設計為非 public 。
因此,在一定程度上,門面模式在 java 中基本上可以不使用了。
標準的門面模式雖然可以不再使用,但是這種提供一個中間類或者中間方法來方便客戶程序使用的思想應該值得我們來實踐的
?
?
? ?
六、
總結
?
門面模式從整體來看,給我的感覺是,它對于使兩層之間的調用粗顆粒化很有幫助,避免了大量細顆粒度的訪問。這和
SOA
中的一些觀點是相同的。
???門面模式大體介紹完了。請指正:)
門面模式從整體來看,給我的感覺是,它對于使兩層之間的調用粗顆粒化很有幫助,避免了大量細顆粒度的訪問。這和 SOA 中的一些觀點是相同的。
???門面模式大體介紹完了。請指正:)