詳解JAVA面向對象的設計模式 (四)、外觀模式

外觀模式 Facade

外觀模式內容相對簡單,就不寫新的例子了。本篇文章摘錄自 http://c.biancheng.net/view/1369.htmlhtml

外觀模式的定義與特色

外觀(Facade)模式的定義:是一種經過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大下降應用程序的複雜度,提升了程序的可維護性。java

外觀(Facade)模式是「迪米特法則」的典型應用,它有如下主要優勢。.net

  1. 下降了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
  2. 對客戶屏蔽了子系統組件,減小了客戶處理的對象數目,並使得子系統使用起來更加容易。
  3. 下降了大型軟件系統中的編譯依賴性,簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統不會影響其餘的子系統,也不會影響外觀對象。

外觀(Facade)模式的主要缺點以下。設計

  1. 不能很好地限制客戶使用子系統類。
  2. 增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

外觀模式的結構與實現

外觀(Facade)模式的結構比較簡單,主要是定義了一個高層接口。它包含了對各個子系統的引用,客戶端能夠經過它訪問各個子系統的功能。如今來分析其基本結構和實現方法。code

1. 模式的結構

外觀(Facade)模式包含如下主要角色。htm

  1. 外觀(Facade)角色:爲多個子系統對外提供一個共同的接口。
  2. 子系統(Sub System)角色:實現系統的部分功能,客戶能夠經過外觀角色訪問它。
  3. 客戶(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()被調用!");
    }
}

程序運行結果以下:blog

public class FacadePattern{   
    public static void main(String[] args)    {       
        Facade f=new Facade();
        f.method();    
    }
}
/**
子系統01的method1()被調用!
子系統02的method2()被調用!
子系統03的method3()被調用!
**/

外觀模式的應用場景

一般在如下狀況下能夠考慮使用外觀模式。接口

  1. 對分層結構系統構建時,使用外觀模式定義子系統中每層的入口點能夠簡化子系統之間的依賴關係。
  2. 當一個複雜系統的子系統不少時,外觀模式能夠爲系統設計一個簡單的接口供外界訪問。
  3. 當客戶端與多個子系統之間存在很大的聯繫時,引入外觀模式可將它們分離,從而提升子系統的獨立性和可移植性。

外觀模式的擴展

在外觀模式中,當增長或移除子系統時須要修改外觀類,這違背了「開閉原則」。若是引入抽象外觀類,則在必定程度上解決了該問題,其結構圖如圖 5 所示。get

引入抽象外觀類的外觀模式的結構圖

相關文章
相關標籤/搜索