定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易地使用。
类图
实现,外观模式涉及到的角色
外观(Facade)角色:客户端直接调用这个角色的方法,该角色知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。
子系统(SubSystem)角色:子系统角色集合实现子系统的功能,处理 Facade 对象指派的任务。注意子类中没有 Facade 的任何信息,即没有对 Facade 对象的引用。
实例
外观类Facade
/**
* 外观模式:门面类
*/
public class Facade {
private SubModuleA subModuleA;
private SubModuleB subModuleB;
private SubModuleC subModuleC;
public Facade() {
this.subModuleA = new SubModuleA();
this.subModuleB = new SubModuleB();
this.subModuleC = new SubModuleC();
}
public void testFacade() {
subModuleA.methodA();
subModuleB.methodB();
subModuleC.methodC();
}
}
子系统(SubSystem)集合中的类A SubModuleA
/**
* 外观模式:子系统A
*/
public class SubModuleA {
public void methodA() {
System.out.println("子系统 SubModuleA 的方法 methodA 被调用!");
}
}
子系统(SubSystem)集合中的类B SubModuleB
/**
* 外观模式:子系统B
*/
public class SubModuleB {
public void methodB() {
System.out.println("子系统 SubModuleB 的方法 methodB 被调用!");
}
}
子系统(SubSystem)集合中的类C SubModuleC
/**
* 外观模式:子系统C
*/
public class SubModuleC {
public void methodC() {
System.out.println("子系统 SubModuleC 的方法 methodC 被调用!");
}
}
客户端(Client)测试类 TestFacadePattern
/**
* 外观模式:客户端测试类
*/
public class TestFacadePattern {
public static void main(String[] args) {
Facade facade = new Facade();
facade.testFacade();
}
}
外观模式设计原则
外观模式创建一个接口简化统一的类,用来包装其他子系统中一个或多个复杂的类,通过这个模式,可以认识到另一个OO原则:最少知识原则,即只和你的密友谈话。
这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,需要许多的维护成本。
总结,优点
- 松散耦合:外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 简单易用:外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
- 更好的划分访问层次:通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。