文章目录
-
- [1. 引言:系统复杂,调用者太累](#1. 引言:系统复杂,调用者太累)
- [2. 什么是外观模式](#2. 什么是外观模式)
-
- [GoF 定义](#GoF 定义)
- [3. 外观模式的核心思想](#3. 外观模式的核心思想)
- [4. 外观模式的结构](#4. 外观模式的结构)
- [5. 示例:电脑启动系统](#5. 示例:电脑启动系统)
-
- [5.1 子系统](#5.1 子系统)
- [5.2 外观类](#5.2 外观类)
- [5.3 客户端使用](#5.3 客户端使用)
- [6. 外观模式的优点](#6. 外观模式的优点)
- [7. 外观模式的缺点](#7. 外观模式的缺点)
- [8. 外观 vs 适配器 vs 桥接](#8. 外观 vs 适配器 vs 桥接)
- [9. JDK 中的外观模式](#9. JDK 中的外观模式)
-
- [Spring 的 JdbcTemplate](#Spring 的 JdbcTemplate)
- [10. 典型应用场景](#10. 典型应用场景)
- [11. 一个重要误区](#11. 一个重要误区)
- 参考

1. 引言:系统复杂,调用者太累
在真实项目中,你经常会遇到这种代码:
java
CPU cpu = new CPU();
Memory memory = new Memory();
Disk disk = new Disk();
cpu.start();
memory.load();
disk.read();
如果每个客户端都要写这一堆启动逻辑:
- 调用顺序不能错
- 依赖关系很复杂
- 修改极易引发连锁问题
你会发现:
调用者被迫了解太多"系统内部细节"。
这正是外观模式要解决的问题。
2. 什么是外观模式
GoF 定义
为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。
详解:又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
外观(Facade)模式是"迪米特法则"的典型应用
一句话理解:
给复杂系统套一个"统一入口"。
3. 外观模式的核心思想
外观模式的目标不是添加功能,也不是改变接口,而是:
隔离"使用者"和"复杂实现"。
它的本质是:
- 对外提供简单接口
- 对内协调多个子系统
就像一个前台,你只要找它,不必认识公司所有员工。
4. 外观模式的结构
外观模式主要包含:
- Facade(外观类)
为多个子系统对外提供一个共同的接口。
- 多个子系统类
实现系统的部分功能,客户可以通过外观角色访问它。
5. 示例:电脑启动系统
5.1 子系统
java
public class CPU {
public void start() {
System.out.println("CPU启动");
}
}
java
public class Memory {
public void load() {
System.out.println("内存加载");
}
}
java
public class Disk {
public void read() {
System.out.println("磁盘读取");
}
}
5.2 外观类
java
public class ComputerFacade {
private CPU cpu = new CPU();
private Memory memory = new Memory();
private Disk disk = new Disk();
public void start() {
cpu.start();
memory.load();
disk.read();
System.out.println("电脑启动完成");
}
}
5.3 客户端使用
java
ComputerFacade computer = new ComputerFacade();
computer.start();
客户端再也不用关心 CPU、内存、磁盘的启动顺序。
6. 外观模式的优点
- 简化客户端调用
- 降低系统耦合度
- 提高系统可维护性
- 屏蔽内部复杂性
7. 外观模式的缺点
- 外观类可能变得臃肿
- 过度封装可能隐藏灵活性
- 不符合"对修改完全关闭"
8. 外观 vs 适配器 vs 桥接
| 模式 | 目的 |
|---|---|
| 外观 | 简化接口 |
| 适配器 | 转换接口 |
| 桥接 | 分离变化维度 |
9. JDK 中的外观模式
Spring 的 JdbcTemplate
java
jdbcTemplate.query(...)
内部封装了:
- Connection
- Statement
- ResultSet
- 异常处理
👉 对外提供"数据库访问外观"。
10. 典型应用场景
适合使用
- 系统子模块复杂
- 调用流程固定
- 希望对外提供统一 API
- 微服务、SDK 封装
不适合使用
- 子系统很简单
- 需要细粒度控制
11. 一个重要误区
外观模式不是为了"封死子系统",而是为了"让大多数人用简单接口"。
高级用户仍然可以直接调用底层模块。