外觀模式 Facade
外觀模式內容相對簡單,就不寫新的例子了,本篇文章摘錄自 http://c.biancheng.net/view/1369.html
外觀模式的定義與特點
外觀(Facade)模式的定義:是一種通過為多個復雜的子系統提供一個一致的介面,而使這些子系統更加容易被訪問的模式,該模式對外有一個統一介面,外部應用程式不用關心內部子系統的具體的細節,這樣會大大降低應用程式的復雜度,提高了程式的可維護性,
外觀(Facade)模式是“迪米特法則”的典型應用,它有以下主要優點,
- 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響呼叫它的客戶類,
- 對客戶屏蔽了子系統組件,減少了客戶處理的物件數目,并使得子系統使用起來更加容易,
- 降低了大型軟體系統中的編譯依賴性,簡化了系統在不同平臺之間的移植程序,因為編譯一個子系統不會影響其他的子系統,也不會影響外觀物件,
外觀(Facade)模式的主要缺點如下,
- 不能很好地限制客戶使用子系統類,
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”,
外觀模式的結構與實作
外觀(Facade)模式的結構比較簡單,主要是定義了一個高層介面,它包含了對各個子系統的參考,客戶端可以通過它訪問各個子系統的功能,現在來分析其基本結構和實作方法,
1. 模式的結構
外觀(Facade)模式包含以下主要角色,
- 外觀(Facade)角色:為多個子系統對外提供一個共同的介面,
- 子系統(Sub System)角色:實作系統的部分功能,客戶可以通過外觀角色訪問它,
- 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能,

2. 模式的實作
外觀模式的實作代碼如下:
//外觀角色
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()被呼叫!");
}
}
程式運行結果如下:
public class FacadePattern{
public static void main(String[] args) {
Facade f=new Facade();
f.method();
}
}
/**
子系統01的method1()被呼叫!
子系統02的method2()被呼叫!
子系統03的method3()被呼叫!
**/
外觀模式的應用場景
通常在以下情況下可以考慮使用外觀模式,
- 對分層結構系統構建時,使用外觀模式定義子系統中每層的入口點可以簡化子系統之間的依賴關系,
- 當一個復雜系統的子系統很多時,外觀模式可以為系統設計一個簡單的介面供外界訪問,
- 當客戶端與多個子系統之間存在很大的聯系時,引入外觀模式可將它們分離,從而提高子系統的獨立性和可移植性,
外觀模式的擴展
在外觀模式中,當增加或移除子系統時需要修改外觀類,這違背了“開閉原則”,如果引入抽象外觀類,則在一定程度上解決了該問題,其結構圖如圖 5 所示,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/1079.html
標籤:設計模式
上一篇:設計模式-策略模式
下一篇:CGB2005-京淘9
