###門面模式 ####門面模式意圖html
經過門面的包裝,使應用程序只能看到門面對象,而不會看到具體的細節對象,這樣無疑會下降應用程序的複雜度,而且提升了程序的可維護性。java
例子:編程
一個電源總開關能夠控制四盞燈、一個風扇、一臺空調和一臺電視機的啓動和關閉。該電源總開關能夠同時控制上述全部電器設備,電源總開關即爲該系統的門面模式設計。
圖示ui
####門面模式實現 使用門面模式能夠選擇性地暴露方法。一個模塊中定義的方法能夠分紅兩部分,一部分是給子系統外部使用的,一部分是子系統內部模塊之間相互調用時使用的。有了Facade類,那麼用於子系統內部模塊之間相互調用的方法就不用暴露給子系統外部了。.net
public class Module { /** * 提供給子系統外部使用的方法 */ public void a1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void a2(){}; public void a3(){}; } public class ModuleB { /** * 提供給子系統外部使用的方法 */ public void b1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void b2(){}; public void b3(){}; } public class ModuleC { /** * 提供給子系統外部使用的方法 */ public void c1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void c2(){}; public void c3(){}; } public class ModuleFacade { ModuleA a = new ModuleA(); ModuleB b = new ModuleB(); ModuleC c = new ModuleC(); /** * 下面這些是A、B、C模塊對子系統外部提供的方法 */ public void a1(){ a.a1(); } public void b1(){ b.b1(); } public void c1(){ c.c1(); } }
####門面模式優缺點 #####門面模式優勢設計
鬆散耦合: 這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。code
簡單易用: 門面模式讓子系統更加易用,客戶端再也不須要了解子系統內部的實現,也不須要跟衆多子系統內部的模塊進行交互,只須要跟門面類交互便可。htm
更好的劃分訪問層次: 經過合理使用門面模式,能夠幫助咱們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把須要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。對象
#####門面模式缺點blog
不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。
類圖:
#####解決門面模式缺點 引入抽象外觀類
當增長新的子系統或者移除子系統時須要修改外觀類,能夠經過引入抽象外觀類在必定程度上解決該問題,客戶端針對抽象外觀類進行編程。對於新的業務需求,不修改原有外觀類,而對應增長一個新的具體外觀類,由新的具體外觀類來關聯新的子系統對象,同時經過修改配置文件來達到不修改源代碼並更換外觀類的目的。
參考
http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html