外观模式
简介
外观模式(Facade)外观模式为子系统中的一组接口提供一个一致的界面。
外观模式通过定义一个一致的接口,用来屏蔽内部子类系统细节,使调用端只需要跟这个接口发生调用,不关心子系统的内部细节操作。
工作原理
定义若干个子系统类,根据需求分别实现不同功能的方法,定义一个外观类聚合各个子系统,生成一个构造器进行初始化,最后生成完整的一系列功能方法,客户端直接调用生成好的方法即可。
使用场景
Mybatis源码中的Configuration去创建MetaObject对象使用了外观模式。
注意事项及细节
1.外观模式对外屏蔽了子系统的细节,所以外观模式降低了用户对子系统使用的复杂性。
2.通过合理的使用外观模式,可以更好的划分访问层级关系,系统需要分层设计时,可考虑外观模式。
3.外观模式对客户端与子系统的耦合关系,让子系统内部的模块更容易的扩展和维护。
4.在维护一个遗留的大型系统时,可能这个系统写的非常乱难以维护和扩展,这时候考虑开发一个外观模式的类,来提供遗留系统的比较简单清晰的接口,提高复用性。
结构图
练习实例
public class FacadePattern {
public static void main(String[] args) {
Facade f = new Facade();
f.method();
}
}
//外观角色
class Facade {
private SubSystem01 obj1 = new SubSystem01();
private SubSystem02 obj2 = new SubSystem02();
private SubSystem03 obj3 = new SubSystem03();
public void method() {
obj1.method1();
obj2.method2();
obj3.method3();
}
}
//子系统角色
class SubSystem01 {
public void method1() {
System.out.println("子系统01的method1()被调用!");
}
}
//子系统角色
class SubSystem02 {
public void method2() {
System.out.println("子系统02的method2()被调用!");
}
}
//子系统角色
class SubSystem03 {
public void method3() {
System.out.println("子系统03的method3()被调用!");
}
}