“Facade” 是设计模式中的一种结构型模式,中文名为“外观模式”,主要目的是为复杂子系统提供一个统一的接口,让外部调用者无需了解系统内部的复杂结构和细节,就能方便地使用系统功能。
🧱 Facade 模式的核心思想:
“让外部系统与一个复杂子系统交互时,只通过一个简单的接口。”
✅ 应用场景
- 一个系统有多个复杂子系统或类,调用顺序繁琐;
- 客户端希望使用一套简单的 API 来完成一个任务;
- 需要对外屏蔽子系统的实现细节,降低耦合性。
🧩 示例(Java)
假设你有一个家庭影院系统,有多个子系统:DVD 播放器、音响、投影仪、灯光等。启动影院非常麻烦,客户端需要按顺序调用多个类的方法。
🧱 子系统类:
class DVDPlayer {
void on() { System.out.println("DVD 打开"); }
void play() { System.out.println("DVD 播放"); }
}
class Projector {
void on() { System.out.println("投影仪打开"); }
}
class Light {
void dim() { System.out.println("灯光调暗"); }
}
🎯 Facade 类:
public class HomeTheaterFacade {
private DVDPlayer dvd;
private Projector projector;
private Light light;
public HomeTheaterFacade(DVDPlayer dvd, Projector projector, Light light) {
this.dvd = dvd;
this.projector = projector;
this.light = light;
}
public void watchMovie() {
System.out.println("准备看电影...");
light.dim();
projector.on();
dvd.on();
dvd.play();
}
}
🚀 客户端调用:
public class Client {
public static void main(String[] args) {
HomeTheaterFacade theater = new HomeTheaterFacade(
new DVDPlayer(),
new Projector(),
new Light()
);
theater.watchMovie();
}
}
🎯 优点
- 简化接口,屏蔽子系统复杂性;
- 降低系统之间的耦合;
- 增强代码可读性和可维护性。
⚠️ 注意
- Facade 模式并不会限制你直接访问子系统类;
- 如果子系统本身频繁变动,Facade 类可能也需要频繁调整。
如果你是用在 Spring Boot、微服务等场景中,Facade 也常用作对外接口的“统一封装服务层”,比如接口网关、统一服务聚合层。