一,什麼是外觀模式
Facade 模式也叫外觀模式,是有GoF提出的 23種設計模式中的一種。 Facade模式爲一組具有類似功能的類羣,比如類庫,子系統等等,提供一個一致的簡單的界面。這個一致的簡單的界面被稱作Facade。
在現實生活中,常常存在辦事較複雜的例子,如辦房產證或註冊一家公司,有時要同多個部門聯繫,這時要是有一個綜合部門能解決一切手續問題就好了。
軟件設計也是這樣,當一個系統的功能越來越強,子系統會越來越多,客戶對系統的訪問也變得越來越複雜。這時如果系統內部發生改變,客戶端也要跟着改變,這違背了“開閉原則”,也違背了“迪米特法則”,所以有必要爲多個子系統提供一個統一的接口,從而降低系統的耦合度,這就是外觀模式的目標。
二,外觀模式的結構
外觀模式是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。
外觀模式的角色和職責
- Facade : 爲調用方 定義簡單的調用接口。
- Clients : 調用者。通過Facade接口調用提供某功能的內部類羣。
- Packages: 功能提供者。指提供功能的類羣(模塊或子系統)。
優點:
- 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
- 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。
- 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。
確定:
- 不能很好地限制客戶使用子系統類。
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
三,外觀模式簡單代碼實現
Packages: 功能提供者。指提供功能的類羣(模塊或子系統)
public class SystemA {
public void doSomething(){
System.out.println("實現A");
}
}
public class SystemB {
public void doSomething(){
System.out.println("實現B");
}
}
public class SystemC {
public void doSomething(){
System.out.println("實現C");
}
}
Facade : 爲調用方 定義簡單的調用接口。
public class Facade {
private SystemA systemA;
private SystemB systemB;
private SystemC systemC;
public Facade() {
systemA = new SystemA();
systemB = new SystemB();
systemC = new SystemC();
}
public void doSomething(){
this.systemA.doSomething();
this.systemB.doSomething();
this.systemC.doSomething();
}
}
測試:
public class Test {
public static void main(String[] args) {
Facade facade =new Facade();
facade.doSomething();
}
}
四:外觀模式的應用場景
- 對分層結構系統構建時,使用外觀模式定義子系統中每層的入口點可以簡化子系統之間的依賴關係。
- 當一個複雜系統的子系統很多時,外觀模式可以爲系統設計一個簡單的接口供外界訪問。
- 當客戶端與多個子系統之間存在很大的聯繫時,引入外觀模式可將它們分離,從而提高子系統的獨立性和可移植性。
五:外觀模式的擴展
在外觀模式中,當增加或移除子系統時需要修改外觀類,這違背了“開閉原則”。如果引入抽象外觀類,則在一定程度上解決了該問題。 如圖: