經過引入一個外觀角色來簡化客戶端與子系統之間的交互,爲複雜的子系統調用提供一個統一的入口,下降子系統與客戶端的耦合度,且客戶端調用很是方便。又稱爲門面模式。bash
外觀模式由兩部分組成:this
- Facade(外觀角色):在客戶端調用它的方法,在外觀角色中能夠知道相關的(一個或者多個)子系統的功能和責任;在正常狀況下,它將全部從客戶端發來的請求委託到相關的子系統去,傳統給相應的子系統對象處理。
- SubSystem(子系統角色):在軟件系統中能夠有一個或者多個子系統角色,每個子系統能夠不是一個單獨的類,而是一個類的集合,它實現子系統的功能;每個子系統均可以被客戶端直接調用,或者被外觀角色調用,它處理由外觀類傳過來的請求;子系統並不知道外觀的存在,對於子系統而言,外觀角色僅僅是另一個客戶端而已。
3.1 電器類(子系統角色)spa
public class Light {
public void on() {
System.out.println("打開燈...");
}
public void off() {
System.out.println("關閉燈...");
}
}
複製代碼
public class TV {
public void on() {
System.out.println("打開電視...");
}
public void off() {
System.out.println("關閉電視...");
}
}
複製代碼
public class AirCondition {
public void on() {
System.out.println("打開空調...");
}
public void off() {
System.out.println("關閉空調...");
}
}
複製代碼
3.2 智能遙控器(外觀角色)設計
public class Facade {
private Light light;
private TV tv;
private AirCondition airCondition;
public Facade() {
this.light = new Light();
this.tv = new TV();
this.airCondition = new AirCondition();
}
public void open() {
light.on();
tv.on();
airCondition.on();
}
public void close() {
tv.off();
light.off();
}
}
複製代碼
3.3 客戶端調用3d
public class Client {
public static void main(String[] args) {
AirCondition airCodition = new AirCondition();
Facade facade = new Facade();
System.out.println("----------下班回到家----------");
facade.open();
System.out.println("----------上牀睡覺----------");
facade.close();
System.out.println("----------早上起牀----------");
airCodition.off();
}
}
複製代碼
- 當要爲一個複雜子系統提供一個簡單接口時可使用外觀模式。該接口能夠知足大多數用戶的需求,並且用戶也能夠越過外觀類直接訪問子系統。
- 客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提升子系統的獨立性和可移植性。
- 在層次化結構中,可使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而經過外觀類創建聯繫,下降層之間的耦合度。
- 當維護一個遺留的大型系統時,可能這個系統已經很是難以維護和拓展但由於它含有重要的功能,新的需求必須依賴於它,則可使用外觀類,來爲設計粗糙或者複雜的遺留代碼提供一個簡單的接口,讓新系統和外觀類交互,而外觀類負責與遺留的代碼進行交互。
- 對客戶端屏蔽子系統組件,減小了客戶處理的對象數目並使用子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。
- 實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。
- 下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統,一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。
- 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。
- 不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
- 在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。
特別聲明:一、如若文中有錯之處,歡迎大神指出。 二、文章是參考網上一些大神的文章,本身整理出來的,如如有侵權,可聯繫我刪除。 code