外观模式(Facade)是最简单也最实用的模式之一:提供一个统一入口,屏蔽内部子系统的复杂调用。客户端只跟"外观"打交道,不用管背后有多少个类在协作。这篇讲清它怎么简化调用。
一、解决什么问题:子系统调用复杂
一个操作可能涉及多个子系统协作。比如"电脑开机",要依次启动 CPU、内存、硬盘:
java
// 不用外观:客户端要记住开机的一堆步骤和顺序
CPU cpu = new CPU();
Memory memory = new Memory();
Disk disk = new Disk();
cpu.start();
memory.load();
disk.read();
// 每个用到开机的地方都要写这一串,漏一步就出错外观模式:把这些步骤封装成一个"外观"类,客户端只调一个方法。
二、核心结构
java
// 子系统(多个,各自复杂)
class CPU { void start() { System.out.println("CPU 启动"); } }
class Memory { void load() { System.out.println("内存加载"); } }
class Disk { void read() { System.out.println("硬盘读取"); } }
// 外观:统一入口,封装开机的一串步骤
class Computer {
private CPU cpu = new CPU();
private Memory memory = new Memory();
private Disk disk = new Disk();
public void start() { // 一个方法搞定
cpu.start();
memory.load();
disk.read();
}
}
// 客户端:只跟外观打交道,不用管内部几个子系统
new Computer().start();关键:客户端从"调 3 个类、记 3 步顺序"简化成"调 1 个方法"。子系统内部怎么协作、顺序是什么,客户端完全不关心。
三、核心价值
- 简化调用:复杂子系统 → 一个入口
- 降低耦合:客户端只依赖外观,不依赖一堆子系统
- 隔离变化:子系统改了,只需改外观,客户端不动
四、实际应用
- SLF4J:统一日志门面,屏蔽 log4j/logback 的差异(你写
slf4j接口,换实现不用改代码) JdbcTemplate:Spring 封装 JDBC 的一堆样板(连接、Statement、异常处理),你只调一个query- 网关/门面服务:微服务里对外提供一个统一入口
小结
- 外观 = 统一入口,屏蔽子系统的复杂调用
- 客户端只调外观,不管内部协作细节
- 典型:SLF4J 日志门面、JdbcTemplate、网关
相关:《适配器模式》(外观是"简化",适配器是"转换",两者容易混)。
