java設計模式-外觀模式

燕雀安知毛驢之志發表於2020-12-14

一,概念介紹

  外觀模式(Facade),他隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用

二,程式碼實現

    直接上程式碼吧,邊看程式碼遍理解概念,我覺得這樣效果也不錯,

  第一步:先定義系統A、系統B、系統C這三個類,

package test;

/**
 *  A系統
 * @author ningbeibei
 *
 */
public class SystemA {
    //A系統方法
    public void functionA() {
        System.out.println("我是系統A...");
    }
}
package test;

/**
 *  B系統
 * @author ningbeibei
 *
 */
public class SystemB {
    //B系統方法
    public void functionB() {
        System.out.println("我是系統B...");
    }
package test;

/**
 *  C系統
 * @author ningbeibei
 *
 */
public class SystemC {
    //C系統方法
    public void functionC() {
        System.out.println("我是系統C...");
    }
}

第二步:定義一個高層介面,分別宣告呼叫三個子系統得方法

package test;

/**
 * 定義一個更高層得介面,使其實現類實現所有方法
 * @author ningbeibei
 *
 */
public interface Facade {
    //方法A
    void methodA();
    //方法B
    void methodB();
    //方法C
    void methodC();
}

第三步:實現定義得高層介面,並且持有子系統物件引用

package test;

/**
  * 實現我們剛才定義得高層介面中得方法 
 * @author ningbeibei
 *
 */
public class FacadeImpl implements Facade {

    //這個系統需要實現類中持有他得引用。
    private SystemA systema;
    private SystemB systemb;
    private SystemC systemc;
    
    /**
     * 重寫實現類構造方法,初始化這個三個類得物件
     */
    FacadeImpl(){
        systema = new SystemA();
        systemb = new SystemB();
        systemc = new SystemC();
        
    }
    
    //呼叫A系統方法
    @Override
    public void methodA() {
        systema.functionA();
    }
    //呼叫B系統方法
    @Override
    public void methodB() {
        systemb.functionB();
    }
    //呼叫B系統方法
    @Override
    public void methodC() {
        systemc.functionC();
    }

}

第四步:測試類編寫

package test;

/**
 * 測試類
 * @author ningbeibei
 *
 */
public class test1 {

    //測試方法
    public static void main(String[] args) {
        
        /**客戶端在呼叫這個三個系統時只需要通過Facade
         * 這個介面就可以訪問各個系統得方法*/
        Facade fac = new FacadeImpl();
        fac.methodA();
        fac.methodB();
        fac.methodC();
    }

}

執行結果

 

 

三、優點

  - 鬆散耦合

  使得客戶端和子系統之間解耦,讓子系統內部的模組功能更容易擴充套件和維護;

  - 簡單易用

  客戶端根本不需要知道子系統內部的實現,或者根本不需要知道子系統內部的構成,它只需要跟Facade類互動即可。

  - 更好的劃分訪問層次

  有些方法是對系統外的,有些方法是系統內部相互互動的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就可以實現客戶端的使用,很好的隱藏了子系統內部的細節。

 

四、我寫得不足之處望各位批評指正

 

相關文章