外观模式
一、概念
外观模式的主要目的在于让外部减少与子系统内部多个模块的交互,从而让外部能够更简单得使用子系统。它负责把客户端的请求转发给子系统内部的各个模块进行处理。
主要负责组合已有功能来实现客户端请求,不会添加新功能的实现。
二、使用场景
- 要为一个复杂子系统提供一个简单接口时。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性
- 需要构建一个层次结构的子系统时。
三、UML结构
外观模式UML.png
四、代码示例
ModuleA:
public class ModuleA {
public void testFuncA(){
System.out.println("This is Function From ModuleA");
}
}
ModuleB:
public class ModuleB {
public void testFuncB(){
System.out.println("This is Function From ModuleB");
}
}
ModuleC:
public class ModuleC {
public void testFuncC(){
System.out.println("This is Function From ModuleC");
}
}
Facade:
public class Facade {
private ModuleA moduleA = null;
private ModuleB moduleB = null;
private ModuleC moduleC = null;
//为了让整个系统只有一个外观类,使用单例,并将其他方法声明为静态方法。
private static Facade facade = null;
private Facade(){
moduleA = new ModuleA();
moduleB = new ModuleB();
moduleC = new ModuleC();
}
public static Facade getInstance(){
if(facade == null){
facade = new Facade();
}
return facade;
}
public void testOperation(){
moduleA.testFuncA();
moduleB.testFuncB();
moduleC.testFuncC();
}
}
Client:
public class Client {
public static void main(String[] args) {
//不管内部发生了什么变化,客户端是不需要改变的
Facade.getInstance().testOperation();
/**
* This is Function From ModuleA
This is Function From ModuleB
This is Function From ModuleC
*/
}
}
五、外观模式的优点
- 由于Facade类封装了各个模块交互的过程,如果今后内部模块调用关系发生了变化,只需要修改Facade实现就可以了
- Facade实现是可以被多个客户端调用的。