外观模式

定义

外观模式又叫门面模式,是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高程序的可维护性。

结构

外观模式包含以下主要角色:

  • 外观角色: 为多个子系统提供一个共同的接口。
  • 子系统角色: 实现系统的部分功能,客户可以通过外观角色访问它。
  • 客户角色: 通过一个外观角色访问各个子系统的功能。

适用场景

  • 子系统越来越复杂,增加外观模式提供简单调用接口。
  • 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。

优点和缺点

优点

  • 简化了调用过程,无需深入了解子系统,防止带来风险。
  • 减少系统依赖、松散耦合。
  • 更好的划分访问层次。
  • 符合迪米特法则,即最少知道原则。

缺点

  • 增加子系统、扩展子系统行为容易引入风险。
  • 不符合开闭原则。

代码实现

假设我们现在有三个系统,SubSystem01SubSystem02SubSystem03,每个系统里面都有各自的逻辑处理方法;
我们现在有一个需求,需要调用三个系统联合去处理一个业务,那么就需要分别创建出SubSystem01SubSystem02SubSystem03系统的实例,然后调用对应的方法执行业务逻辑,
如果对象的创建,或者需要调用的方法很繁琐,那么每次处理逻辑,都要进行这块调用的处理,就很麻烦;
所以我们可以将这几个系统作为子系统,然后以一个高层系统(外观角色)进行封装,对外暴露一个相对简单的接口。

子系统1:

1
2
3
4
5
6
7
public class SubSystem01 {

public void method1(){
System.out.println("子系统01的method1方法被调用");
}

}

子系统2:

1
2
3
4
5
6
7
public class SubSystem02 {

public void method2(){
System.out.println("子系统02的method2方法被调用");
}

}

子系统3:

1
2
3
4
5
6
7
public class SubSystem03 {

public void method3(){
System.out.println("子系统03的method3方法被调用");
}

}

外观角色:

1
2
3
4
5
6
7
8
9
10
11
12
public class Facade {

SubSystem01 obj1 = new SubSystem01();
SubSystem02 obj2 = new SubSystem02();
SubSystem03 obj3 = new SubSystem03();

public void method(){
obj1.method1();
obj2.method2();
obj3.method3();
}
}

调用:

1
2
3
4
5
6
7
8
public class Test {

public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}

}

结果:

1
2
3
子系统01的method1方法被调用
子系统02的method2方法被调用
子系统03的method3方法被调用

UML类图