什麼是外觀模式?java
外觀模式(Facade),爲子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。 設計模式
簡單點說:外觀模式是一種使用頻率很是高的結構型設計模式,它經過引入一個外觀角色來簡化客戶端與子系統之間的交互,爲複雜的子系統調用提供一個統一的入口,下降子系統與客戶端的耦合度,且客戶端調用很是方便。spa
概述:設計
在真實的應用系統中,一個子系統可能由不少類組成。子系統的客戶爲了它們的須要,須要和子系統中的一些類進行交互。客戶和子系統的類進行直接的交互會致使客戶端對象和子系統之間高度耦合。任何的相似於對子系統中類的接口的修改,會對依賴於它的全部的客戶類形成影響。
code
從上面外觀模式的定義咱們看以看到外觀模式能很好的解決上述問題,爲子系統提供了一個更高層次、更簡單的接口,從而下降了子系統的複雜度和依賴。這使得子系統更易於使用和管理。對象
外觀是一個能爲子系統和客戶提供簡單接口的類。當正確的應用外觀,客戶再也不直接和子系統中的類交互,而是與外觀交互。外觀承擔與子系統中類交互的責任。實際上,外觀是子系統與客戶的接口,這樣外觀模式下降了子系統和客戶的耦合度。
接口
實例:開發
下面用一個簡單的例子來講明外觀模式:string
結構圖:it
子系統類一般是一些業務類,實現了一些具體的、獨立的業務功能,其典型代碼以下:
class One{ public void MethodA(){ System.out.println( "methodA--> is runing" ); } } class Two{ public void MethodB(){ System.out.println( "methodB--> is runing" ); } } class Three{ public void MethodC(){ System.out.println( "methodC--> is runing" ); } } class Four{ public void MethodD(){ System.out.println( "methodD--> is runing" ); } }
在引入外觀類以後,與子系統業務類之間的交互統一由外觀類來完成,在外觀類中一般存在以下代碼:
class Facade{ private One obj1 = new One(); private Two obj2 = new Two(); private Three obj3 = new Three(); private Four obj4 = new Four(); public void Method1(){ System.out.println("方法組1"); obj1.MethodA(); obj2.MethodB(); obj3.MethodC(); } public void Method2(){ System.out.println("方法組2"); obj1.MethodA(); obj2.MethodB(); obj4.MethodD(); } }
因爲在外觀類中維持了對子系統對象的引用,客戶端能夠經過外觀類來間接調用子系統對象的業務方法,而無須與子系統對象直接交互。引入外觀類後,客戶端代碼變得很是簡單,典型代碼以下:
class Program{ static void Main(string[] args){ Facade facade = new Facade(); facade.Method1(); facade.Method2(); } }
什麼時候使用外觀模式?
第一:設計初期階段,有意識的將不一樣的兩個層分離,層與層之間創建外觀Facade,這樣就能夠爲複雜的子系統提供一個簡單的接口,耦合性下降。
第二:在開發階段,子系統每每由於不斷的重構演化而變的愈來愈複雜,增長外觀Facade能夠提供一個簡單的接口,減小它們之間的依賴性.
第三:維護一個大型系統時,可能這個系統已經很是難以維護和擴展,此時能夠爲系統新開發一個Facade類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單接口,讓新系統與Facade對象交互,Facade與遺留代碼交互全部複雜的工做。