1 定义
外观模式(Facade Pattern)又叫门面模式,属于结构型设计模式之一。它主要用于当存在多个复杂的子系统需要调用时,通过引用一个外观角色进行组合性封装来简化对外调用的入口,降低子系统与调用者的耦合度和降低调用者使用成本,一般常用于对SDK或者API的封装。例如实现场景中,我们使用一些电脑优化工具软件进行优化时,软件一般提供了:垃圾清理、病毒查杀、注册表清理、大文件查找等功能,而一般也会直接提供了一个充当外观角色的一键优化入口,当我们触发一键优化时,工具便会自动帮我们执行内部相应的子功能进行电脑的优化。
2 实现
外观模式一般包含了2个角色,分别是:
- 子系统(SubSystem),可以有一个或者多个子系统,也就是多个子功能,每个子系统受外观类指派的任务。例如上述定义举例的垃圾清理、病毒查杀、注册表清理子功能。
- 外观(Facade),将子系统进行封装来提供对调用者统一简单的调用入口,当调用者执行请求时会委派相应的子系统去完成相关逻辑。例如上述定义举例的一键优化。
子系统类,可以存在一个或多个,可以是同一个类也可以是不同的类:
public class Disk {
public static void cleanRubbish() {
System.out.println("清理垃圾");
}
public static void findBigFile() {
System.out.println("查找大文件");
}
}
public class Regedit {
public static void clean() {
System.out.println("清理注册表");
}
}
public class Virus {
public static void kill() {
System.out.println("查杀病毒");
}
}
外观类,它整合了两个入口,分别是:一键优化和系统瘦身:
public class Integration {
public static void onKeyOptimization() {
System.out.println("一键优化,执行了:");
Disk.cleanRubbish();
Regedit.clean();
Virus.kill();
}
public static void systemSlim() {
System.out.println("系统瘦身,执行了:");
Disk.cleanRubbish();
Disk.findBigFile();
Regedit.clean();
}
}
客户端:
Integration.onKeyOptimization();
Integration.systemSlim();
输出结果:
一键优化,执行了:
清理垃圾
清理注册表
查杀病毒
系统瘦身,执行了:
清理垃圾
查找大文件
清理注册表
3 总结
外观模式最核心本质就是封装交互,简化调用。大多情况下系统内部会产生很多小的子系统,或者在迭代过程中演化得越来越复杂,这会给外部调用者带来了使用上的不便利,使有外观类进行整合提供一个简单的接口,对外隐藏了系统的具体实现和隔离了变化,这样也减少调用者与多个系统的关联依赖。但有个小缺点就是当一个子系统业务出现变更时,它虽然不会对调用者和其它子功能造成影响,但有可能需要修改到外观类,这也存在着违背开闭原则。