在現實生活中,常常存在辦事較複雜的例子,如辦房產證或註冊一家公司,有時要同多個部門聯繫,這時要是有一個綜合部門能解決一切手續問題就好了。
軟件設計也是這樣,當一個系統的功能越來越強,子系統會越來越多,客戶對系統的訪問也變得越來越複雜。這時如果系統內部發生改變,客戶端也要跟着改變,這違背了“開閉原則”,也違背了“迪米特法則”,所以有必要爲多個子系統提供一個統一的接口,從而降低系統的耦合度,這就是外觀模式的目標。
外觀模式的定義與特點
外觀(Facade)模式的定義:是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。
外觀(Facade)模式是“迪米特法則”的典型應用,它有以下主要優點。
- 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
- 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。
- 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。
外觀(Facade)模式的主要缺點如下。
- 不能很好地限制客戶使用子系統類。
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
外觀模式的結構與實現
觀(Facade)模式的結構比較簡單,主要是定義了一個高層接口。它包含了對各個子系統的引用,客戶端可以通過它訪問各個子系統的功能。現在來分析其基本結構和實現方法。
1. 模式的結構
外觀(Facade)模式包含以下主要角色。
- 外觀(Facade)角色:爲多個子系統對外提供一個共同的接口。
- 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。
- 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能。
其結構圖
代碼如下
package test.facade;
public class FacadePattern {
public static void main(String[] args) {
Facade f=new Facade();
f.method();
}
}
//外觀角色
class Facade{
private SubSystem01 obj1=new SubSystem01();
private SubSystem02 obj2=new SubSystem02();
private SubSystem03 obj3=new SubSystem03();
public void method(){
obj1.method1();
obj2.method2();
obj3.method3();
}
}
//子系統角色
class SubSystem01{
public void method1(){
System.out.println("子系統01的method1()被調用");
}
}
//子系統角色
class SubSystem02{
public void method2(){
System.out.println("子系統02的method2()被調用");
}
}
//子系統角色
class SubSystem03{
public void method3(){
System.out.println("子系統03的method3()被調用");
}
}
結果