外观模式
1.定义:
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。
2.使用场景:
- 为一个复杂子系统提供一个简易接口。外观模式可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化;
- 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果各子系统之间是相互依赖的,那么通过外观模式进行接口通信,使得各子系统之间相互解耦,达到各子系统互不依赖的效果。
3.UML图
4.详解:
外观模式是开发过程中使用频率极高的一种结构型设计模式。假如现在需要开发一个第三方SDK,一般都会使用外观模式,对外隐藏系统内部的实现细节,仅提供一个统一的接口供外部调用,这样既减低了用户使用成本,也对用户屏蔽了很多的实现细节。
下面看代码举例:
private static class SubSystemA {
private void start() {
System.out.println("sub system A start");
}
private void end() {
System.out.println("sub system A end");
}
}
private static class SubSystemB {
private void start() {
System.out.println("sub system B start");
}
private void end() {
System.out.println("sub system B end");
}
}
private static class SubSystemC {
private void start() {
System.out.println("sub system C start");
}
private void end() {
System.out.println("sub system C end");
}
}
上面三个类表示整个系统的三个子系统,下面是对外统一的外观类,它持有三个子系统类的实例,并对外提供统一的接口(start/end),方便外部调用:
public static class SystemFacade {
private static SubSystemA subSystemA = new SubSystemA();
private static SubSystemB subSystemB = new SubSystemB();
private static SubSystemC subSystemC = new SubSystemC();
private void start() {
subSystemA.start();
subSystemB.start();
subSystemC.start();
}
private void end() {
subSystemA.end();
subSystemB.end();
subSystemC.end();
}
}
测试代码:
public static void main(String[] args) {
SystemFacade systemFacade = new SystemFacade();
systemFacade.start();
systemFacade.end();
/**
sub system A start
sub system B start
sub system C start
sub system A end
sub system B end
sub system C end
*/
}
到这里,外观模式的代码举例就结束了,从输出结果一看便知,各子系统均参与了工作,而且它们之间完全解耦,达到预期目的。