java設計模式--外觀模式

外觀模式:爲子系統中的一組接口提供一個一致的界面,該模式定義了一個高層接口,這個接口使這個子系統更加容易使用。架構

咱們先看一個使用外觀模式的例子,首先定義了三個子系統類ide

public class SubSystemA {
    public void functionA(){
        System.out.println("子系統A方法");
    }
}

public class SubSystemB {
    public void functionB(){
        System.out.println("子系統B方法");
    }
}

public class SubSystemC {
    public void functionC(){
        System.out.println("子系統C方法");
    }
}

使用外觀模式定義了一個高層接口,這個接口定義了調用子系統的方法spa

public interface Facade {
    void methodA();
    void methodB();
    void methodC();
}

接口調用子系統的具體實現code

public class FacadeImpl implements Facade {

    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    private SubSystemC subSystemC;

    public FacadeImpl(){
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
        subSystemC = new SubSystemC();
    }
    @Override
    public void methodA() {
        System.out.println("methodA");
        subSystemA.functionA();
    }

    @Override
    public void methodB() {
        System.out.println("methodB");
        subSystemB.functionB();
        subSystemC.functionC();
    }

    @Override
    public void methodC() {
        System.out.println("methodC");
        subSystemA.functionA();
        subSystemC.functionC();
    }
}

使用外觀模式的調用方法blog

public class Test1 {
    public static void main(String[] args) {
        Facade facade = new FacadeImpl();
        facade.methodA();
        facade.methodB();
        facade.methodC();
    }
}

執行結果:接口

methodA
子系統A方法
methodB
子系統B方法
子系統C方法
methodC
子系統A方法
子系統C方法io

 

下面是沒有使用外觀模式時客戶端的調用方法function

public class Test2 {
    public static void main(String[] args) {
        SubSystemA subSystemA = new SubSystemA();
        SubSystemB subSystemB = new SubSystemB();
        SubSystemC subSystemC = new SubSystemC();

        subSystemA.functionA();
        System.out.println("----------------");
        subSystemB.functionB();
        subSystemC.functionC();
        System.out.println("----------------");
        subSystemA.functionA();
        subSystemC.functionC();

    }
}

執行結果:class

子系統A方法
----------------
子系統B方法
子系統C方法
----------------
子系統A方法
子系統C方法service

 

  經過對比咱們能夠發現外觀模式定義了一個外觀類Facade,這個類瞭解全部子系統的方法和屬性,在其內部進行組合後客戶端進行調用,若是不使用外觀模式,客戶端須要去了解全部子系統中的類和屬性,有了外觀模式,客戶端只須要知道外觀類Facade就能夠了。

咱們常用的三層架構就能夠理解爲一個外觀模式的實例,若是沒有service層,咱們的controller層就可能須要直接去關聯多個dao才能實現功能,這樣就會出現多個controller和dao交叉關聯,使系統愈來愈複雜,這時咱們就能夠抽象出一層service和dao接口使得耦合程

度下降,除此以外,在維護一個遺留的大型系統時,咱們也能夠抽象出一個接口,用這個接口去和這個舊系統交互,新系統只須要與外觀類交互,這樣能夠使得代碼維護的複雜程度大大下降。

相關文章
相關標籤/搜索