外觀模式:爲子系統中的一組接口提供一個一致的界面,該模式定義了一個高層接口,這個接口使這個子系統更加容易使用。架構
咱們先看一個使用外觀模式的例子,首先定義了三個子系統類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接口使得耦合程
度下降,除此以外,在維護一個遺留的大型系統時,咱們也能夠抽象出一個接口,用這個接口去和這個舊系統交互,新系統只須要與外觀類交互,這樣能夠使得代碼維護的複雜程度大大下降。