概述

外观模式的主要目的在于让外部减少与子系统内部多个模块的交互,从而让外部能够更简单得使用子系统。它负责把客户端的请求转发给子系统内部的各个模块进行处理,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();
}
}
Contents
  1. 1. 概述
  2. 2. 外观模式的优点