外觀模式

一,定義

外觀模式(Facade):爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
這裏寫圖片描述

二,角色

  • 1,外觀(Facade)角色 :客戶端可以調用這個角色的方法。此角色知曉相關子系統的功能和責任。在正常情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統去。
  • 2,子系統(SubSystem)角色:可以同時有一個或者多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合。每個子系統都可以被客戶端直接調用,或者被外觀角色調用。子系統並不知道外觀角色的存在,對於子系統而言,外觀角色僅僅是另外一個客戶端而已。

三,示例

public class SubSystemOne {
    public void methodOne(){
        System.out.println("子系統方法一");
    }
}

public class SubSystemTwo {
    public void methodTwo(){
        System.out.println("子系統方法二");
    }
}

public class SubSystemThree {
    public void methodThree(){
        System.out.println("子系統方法三");
    }
}

public class SubSystemFour {
    public void methodFour(){
        System.out.println("子系統方法四");
    }
}

public class Facade {
    //外觀類
    private SubSystemOne one;
    private SubSystemTwo two;
    private SubSystemThree three;
    private SubSystemFour four;

    public Facade(){
        one = new SubSystemOne();
        two = new SubSystemTwo();
        three = new SubSystemThree();
        four = new SubSystemFour();
    }

    public void methodA(){
        one.methodOne();
        two.methodTwo();
        four.methodFour();
    }

    public void methodB(){
        two.methodTwo();
        three.methodThree();
    }
}

//test main
    public static void facadeModel(){
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }

Facade類其實相當於子系統中SubClass類的外觀界面,有了這個Facade類,那麼客戶端就不需要親自調用子系統中的那些具體實現的子類了,也不需要知道系統內部的實現細節,甚至都不需要知道這些子類的存在,客戶端只需要跟Facade類交互就好了,從而更好地實現了客戶端和子系統中具體類的解耦,讓客戶端更容易地使用系統。

同時,這樣定義一個Facade類可以有效地屏蔽內部的細節,免得客戶端去調用Module類時,發現一些不需要它知道的方法。如上代碼,我的所有子類中的方法二都是方法一調用的方法,是配合方法一的,他們不需要被客戶端調用,而且具有一定的保密性,這樣使用外觀模式時就可以不被客戶端知道。

四,總結

優點:

  • 實現了子系統與客戶端之間的鬆耦合關係。
  • 客戶端屏蔽了子系統組件,減少了客戶端所需處理的對象數目,並使得子系統使用起來更加容易。

適用場景:

  • 設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。
  • 開發階段,子系統越來越複雜,增加外觀模式提供一個簡單的調用接口。
  • 維護一個大型遺留系統的時候,可能這個系統已經非常難以維護和擴展,但又包含非常重要的功能,爲其開發一個外觀類,以便新系統與其交互。

外觀模式總結:
1、外觀模式爲複雜子系統提供了一個簡單接口,並不爲子系統添加新的功能和行爲。
2、外觀模式實現了子系統與客戶端之間的鬆耦合關係。
3、外觀模式沒有封裝子系統的類,只是提供了簡單的接口。 如果應用需要,它並不限制客戶使用子系統類。因此可以靈活的在系統易用性與通用性之間選擇。
4、外觀模式注重的是簡化接口,它更多的時候是從架構的層次去看整個系統,而並非單個類的層次。

參考:《大話設計模式》 阿木俠 Java知音

示例代碼:https://github.com/wangxp423/ExerciseDesignmodel

發佈了64 篇原創文章 · 獲贊 7 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章