外部與乙個子系統的通訊必須通過乙個統一的門面(facade)物件進行,這就是門面模式。
醫院的例子
用乙個例子進行說明,如果把醫院作為乙個子系統,按照部門職能,這個系統可以劃分為**、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同乙個子系統的客戶端與乙個子系統的各個類打交道一樣,不是一件容易的事情。
首先病人必須先**,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳款,才能到化驗部門做化驗。化驗後,再回到門診室。
解決這種不便的方法便是引進門面模式。可以設定乙個接待員的位置,由接待員負責代為**、劃價、繳費、取藥等。這個接待員就是門面模式的體現,病人只接觸接待員,由接待員負責與醫院的各個部門打交道。
什麼是門面模式
門面模式要求乙個子系統的外部與其內部的通訊必須通過乙個統一的門面(facade)物件進行。門面模式提供乙個高層次的介面,使得子系統更易於使用。
就如同醫院的接待員一樣,門面模式的門面類將客戶端與子系統的內部複雜性分隔開,使得客戶端只需要與門面物件打交道,而不需要與子系統內部的很多物件打交道。
門面模式是物件的結構模式。門面模式沒有乙個一般化的類圖描述,下圖演示了乙個門面模式的示意性物件圖:
在這個物件圖中,出現了兩個角色:
門面(facade)角色: 客戶端可以呼叫這個角色的方法。此角色知曉相關的(乙個或者多個)子系統的功能和責任。在正常情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統去。
子系統(subsystem)角色: 可以同時有乙個或者多個子系統。每乙個子系統都不是乙個單獨的類,而是乙個類的集合。每乙個子系統都可以被客戶端直接呼叫,或者被門面角色呼叫。子系統並不知道門面的存在,對於子系統而言,門面僅僅是另外乙個客戶端而已。
乙個系統可以有幾個門面類
【gof】的書中指出:在門面模式中,通常只需要乙個門面類,並且此門面類只有乙個例項,換言之它是乙個單例類。當然這並不意味著在整個系統裡只能 有乙個門面類,而僅僅是說對每乙個子系統只有乙個門面類。或者說,如果乙個系統有好幾個子系統的話,每乙個子系統有乙個門面類,整個系統可以有數個門面 類。
為子系統增加新行為
初學者往往以為通過繼承乙個門面類便可在子系統中加入新的行為,這是錯誤的。門面模式的用意是為子系統提供乙個集中化和簡化的溝通管道,而不能向子系統加入新的行為。
我們考察乙個保安系統的例子,以說明門面模式的功效。乙個保安系統由兩個錄影機、三個電燈、乙個遙感器和乙個警報器組成。保安系統的操作人員需要經常將這些儀器啟動和關閉。
不使用門面模式的設計
首先,在不使用門面模式的情況下,操作這個保安系統的操作員必須直接操作所有的這些部件。下圖所示就是在不使用門面模式的情況下系統的設計圖。
可以看出,client物件需要引用到所有的錄影機(camera)、電燈(light)、感應器(sensor)和警報器(alarm)物件。**如下:
using system;
public class camera
public void turnoff()
public void rotate(int degrees)
degrees.", degrees);
}}public class light
public void turnon()
public void changebulb() }
public class sensor
public void deactivate()
public void trigger() }
public class alarm
public void deactivate()
public void ring()
public void stopring() }
public class client
public static void main( string args )
}
乙個合情合理的改進方法就是準備乙個系統的控制台,作為保安系統的使用者介面。如下圖所示:
程式**如下:
using system;
public class camera
public void turnoff()
public void rotate(int degrees)
degrees.", degrees);
}}public class light
public void turnon()
public void changebulb() }
public class sensor
public void deactivate()
public void trigger() }
public class alarm
public void deactivate()
public void ring()
public void stopring() }
public class securityfacade
public void activate()
public void deactivate() }
public class client
}
門面(Facade)模式
facade模式也叫外觀模式 在 設計模式 一書中他是這樣敘述的 為子系統中的一組介面提供乙個統一的介面。facade模式定義了乙個更高的介面,使子系統更加容易使用。facade模式的關鍵特徵 意圖 希望簡化原有系統的使用方法,需要定義自己的介面。問題 只需要使用某個複雜系統的子集,或者,需要以一種...
門面模式 facade
門面模式定義 為子系統中的一組介面提供了乙個一致的介面,facade模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。現代的軟體系統都是比較複雜的,設計師處理複雜系統的乙個常見方法便是將其 分而治之 把乙個系統劃分為幾個較小的子系統。如果把醫院作為乙個子系統,按照部門職能,這個系統可以劃分...
門面 Facade 模式
外部與乙個子系統的通訊必須通過乙個統一的門面 facade 物件進行,這就是門面模式。門面模式要求乙個子系統的外部與其內部的通訊必須通過乙個統一的門面 facade 物件進行。門面模式提供乙個高層次的介面,使得子系統更易於使用。一,結構 門面 facade 角色 客戶端可以呼叫這個角色的方法。此角色...