結構型模式之外觀(門面)模式


在現實生活中,常常存在辦事較複雜的例子,如辦房產證或註冊一家公司,有時要同多個部門聯繫,這時要是有一個綜合部門能解決一切手續問題就好了。
軟件設計也是這樣,當一個系統的功能越來越強,子系統會越來越多,客戶對系統的訪問也變得越來越複雜。這時如果系統內部發生改變,客戶端也要跟着改變,這違背了“開閉原則”,也違背了“迪米特法則”,所以有必要爲多個子系統提供一個統一的接口,從而降低系統的耦合度,這就是外觀模式的目標。

外觀模式的定義與特點

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

外觀(Facade)模式是“迪米特法則”的典型應用,它有以下主要優點
1.簡化了調用過程,無需深入瞭解子系統,以防給子系統帶來風險。
2.減少系統的依賴,降低耦合度。
3.更好的劃分層次,提高安全性。
4.遵循迪米爾法則,即最少知道原則。

外觀(Facade)模式的主要缺點如下:
1.當增加子系統和子系統行爲時,可能帶來未知風險。
2.增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
3.某些情況下會違背單一職責原則。

外觀模式的結構

外觀(Facade)模式的結構比較簡單,也很常見,基本我們天天都會接觸到,主要是定義了一個高層接口,它包含了對各個子系統的引用,客戶端可以通過它訪問各個子系統的功能。(比如高層的controller包含了service的引用吧,是不是很常見!)

外觀模式包含以下主要角色:
外觀(Facade)角色:爲多個子系統對外提供一個共同的接口。
子系統(SubSystem)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。

外觀模式的實現

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()被調用!");
    }   
}

程序運行結果如下:

子系統01的method1()被調用!
子系統02的method2()被調用!
子系統03的method3()被調用!

外觀模式的應用場景

通常在以下情況下可以考慮使用外觀模式:
1.子系統越來越複雜,增加門面模式,提供簡單接口。
2.構建多層系統結構,利用門面對象作爲每層的入口,簡化層間調用。

<<上一篇:裝飾器模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章