文章目錄
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述門面(Facade)模式的:
門面模式是對象的結構模式,外部與一個子系統的通訊必須通過一個統一的門面對象進行。門面模式提供一個高層次的介面,使得子系統更便於使用。
醫院的例子
現代的軟體系統都是比較複雜的,設計師處理複雜系統的一個常見方法便是將其“分而治之”,把一個系統劃分為幾個較小的子系統。如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為挂號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同一個子系統的用戶端與一個子系統的各個類打交道一樣,不是一件容易的事情。
首先病人必須先挂號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳費,才可以到化驗部門做化驗。化驗後再回到門診室。
描述的是病人在醫院裡的體驗,圖中的方框代表醫院。
解決這種不便的方法便是引進門面模式,醫院可以設定一個接待員的位置,由接待員負責代為挂號、劃價、繳費、取藥等。這個接待員就是門面模式的體現,病人只接觸接待員,由接待員與各個部門打交道。
門面模式的結構
門面模式沒有一個一般化的類圖描述,最好的描述方法實際上就是以一個例子說明。
由於門面模式的結構圖過於抽象,因此把它稍稍具體點。假設子系統內有三個模組,分別是ModuleA、ModuleB和ModuleC,它們分別有一個樣本方法,那麼此時樣本的整體結構圖如下:
在這個對象圖中,出現了兩個角色:
● 門面(Facade)角色 :用戶端可以調用這個角色的方法。此角色知曉相關的(一個或者多個)子系統的功能和責任。在正常情況下,本角色會將所有從用戶端發來的請求委派到相應的子系統去。
● 子系統(SubSystem)角色 :可以同時有一個或者多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合(如上面的子系統就是由ModuleA、ModuleB、ModuleC三個類組合而成)。每個子系統都可以被用戶端直接調用,或者被門面角色調用。子系統並不知道門面的存在,對於子系統而言,門面僅僅是另外一個用戶端而已。
原始碼
子系統角色中的類:
public class ModuleA {
//示意方法
public void