结构型-外观模式
2026/1/15大约 2 分钟Java设计模式结构型模式外观模式Java设计模式面向对象架构设计最佳实践代码优化
概述
外观模式(Facade Pattern)为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用场景
- 为复杂的子系统提供一个简单的接口
- 客户端与多个子系统之间存在很大的依赖性
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口
角色组成
- Facade(外观角色):客户端调用的接口,知道哪些子系统负责处理请求
- SubSystem(子系统角色):实现子系统的功能,处理Facade指派的任务
代码实现
1. 子系统类
// CPU
public class CPU {
public void start() {
System.out.println("CPU 启动");
}
public void shutdown() {
System.out.println("CPU 关闭");
}
}
// 内存
public class Memory {
public void start() {
System.out.println("内存 启动");
}
public void shutdown() {
System.out.println("内存 关闭");
}
}
// 硬盘
public class Disk {
public void start() {
System.out.println("硬盘 启动");
}
public void shutdown() {
System.out.println("硬盘 关闭");
}
}2. 外观类
public class ComputerFacade {
private CPU cpu;
private Memory memory;
private Disk disk;
public ComputerFacade() {
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start() {
System.out.println("=== 电脑启动 ===");
cpu.start();
memory.start();
disk.start();
System.out.println("=== 启动完成 ===");
}
public void shutdown() {
System.out.println("=== 电脑关机 ===");
disk.shutdown();
memory.shutdown();
cpu.shutdown();
System.out.println("=== 关机完成 ===");
}
}3. 客户端
public class Client {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
System.out.println();
computer.shutdown();
}
}# 输出
=== 电脑启动 ===
CPU 启动
内存 启动
硬盘 启动
=== 启动完成 ===
=== 电脑关机 ===
硬盘 关闭
内存 关闭
CPU 关闭
=== 关机完成 ===类图
实际案例:SLF4J 日志门面
// SLF4J 作为日志门面
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void doSomething() {
logger.info("执行操作");
// SLF4J 屏蔽了底层日志实现(Log4j、Logback等)
}
}JDK 中的应用
javax.faces.context.FacesContextjavax.servlet.http.HttpSession
优缺点
优点:
- 减少系统相互依赖
- 提高灵活性
- 提高安全性
缺点:
- 不符合开闭原则,修改麻烦
- 不能很好地限制客户使用子系统类
外观模式 vs 中介者模式
| 特性 | 外观模式 | 中介者模式 |
|---|---|---|
| 目的 | 简化接口 | 解耦对象 |
| 通信方向 | 单向 | 双向 |
| 子系统感知 | 不知道外观 | 知道中介者 |
