概述
外观模式的主要目的在于让外部减少与子系统内部多个模块的交互,从而让外部能够更简单得使用子系统。它负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade 的方法本身并不进行功能的处理,只是实现一个功能的组合调用。并且一般不会在外观类中定义一些子系统没有的功能,它主要负责组合已有功能来实现客户端的需求,而不是添加新的功能实现。
外观模式的优点
外观模式的好处有如下几点:
- 由于Facade类封装了各个模块交互的过程,如果今后内部模块调用关系发生了变化,只需要修改Facade实现就可以了。
- Facade实现是可以被多个客户端调用的,所以在Facade类中的方法是可以被共享的。
- 即使有外观类的存在也可以不适用,而直接调用模块内的方法。这样就可以兼顾组合功能和细节功能。
如果没有外观类,客户端需要和子系统内部多个模块交互,客户端和这些模块之间都有依赖关系,任何一个模块的变动都可能会引起客户端的变动。使用外观类之后客户端就不需要去关心系统内部模块的变动情况了,客户端只需要和这个外部类有依赖关系,这样当系统内部多个模块发生变化的时候,这个变化可以被这个外观类吸收和消化,并不影响到客户端。
一般系统只需要一个外观类,所以可以使用单例或者私有化构造方法,并将其他方法声明为静态方法。
public class ModuleA { public void testFuncA() { System.out.println("This is Function From ModuleA"); } }
|
public class ModuleB { public void testFuncB() { System.out.println("This is Function From ModuleB"); } }
|
public class ModuleC { public void testFuncC() { System.out.println("This is Function From ModuleC"); } }
|
public class Facade { private ModuleA moduleA = null; private ModuleB moduleB = null; private ModuleC moduleC = null; private static Facade mFacade = null; private Facade(){ moduleA = new ModuleA(); moduleB = new ModuleB(); moduleC = new ModuleC(); } public static Facade getInstance() { if(mFacade == null) { mFacade = new Facade(); } return mFacade; } public void testOperation() { moduleA.testFuncA(); moduleB.testFuncB(); moduleC.testFuncC(); } }
|
public class Client { public static void main(String arg[]) { Facade.getInstance().testOperation(); } }
|