###门面模式 ####门面模式意图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