外觀模式:為子系統中的一組介面提供一個一致的界面,該模式定義了一個高層介面,這個介面使這個子系統更加容易使用。 我們先看一個使用外觀模式的例子,首先定義了三個子系統類 使用外觀模式定義了一個高層介面,這個介面定義了調用子系統的方法 介面調用子系統的具體實現 使用外觀模式的調用方法 執行結果: met ...
外觀模式:為子系統中的一組介面提供一個一致的界面,該模式定義了一個高層介面,這個介面使這個子系統更加容易使用。
我們先看一個使用外觀模式的例子,首先定義了三個子系統類
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介面使得耦合程
度降低,除此之外,在維護一個遺留的大型系統時,我們也可以抽象出一個介面,用這個介面去和這個舊系統交互,新系統只需要與外觀類交互,這樣可以使得代碼維護的複雜程度大大降低。