java設計模式--外觀模式


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

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

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方法");
    }
}

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

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

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

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();
    }
}

使用外觀模式的調用方法

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方法

 

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

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();

    }
}

執行結果:

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

 

  通過對比我們可以發現外觀模式定義了一個外觀類Facade,這個類了解所有子系統的方法和屬性,在其內部進行組合后客戶端進行調用,如果不使用外觀模式,客戶端需要去了解所有子系統中的類和屬性,有了外觀模式,客戶端只需要知道外觀類Facade就可以了。

我們經常使用的三層架構就可以理解為一個外觀模式的實例,如果沒有service層,我們的controller層就可能需要直接去關聯多個dao才能實現功能,這樣就會出現多個controller和dao交叉關聯,使系統越來越復雜,這時我們就可以抽象出一層service和dao接口使得耦合程

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM