Java 外观模式(Facade Pattern)详解
🧭 什么是外观模式?
外观模式是结构型设计模式之一,为子系统中的一组接口提供一个统一的高层接口,使得子系统更易使用。
就像是酒店前台,帮你处理入住、叫车、订餐等各种服务,让你不用和多个部门打交道。
🧠 使用场景
- 简化复杂系统的操作流程
- 封装子系统,提高代码可维护性
- 为旧系统提供统一的接口
🏗️ 模式结构
- Facade(外观类):对外提供统一接口,封装子系统
- Subsystem(子系统类):各个独立的模块或类,完成实际业务
✅ 示例:家庭影院系统
子系统类
public class DVDPlayer {
public void on() { System.out.println("DVD 播放器打开"); }
public void play() { System.out.println("DVD 播放电影"); }
public void off() { System.out.println("DVD 播放器关闭"); }
}
public class Projector {
public void on() { System.out.println("投影仪打开"); }
public void off() { System.out.println("投影仪关闭"); }
}
public class Screen {
public void down() { System.out.println("幕布放下"); }
public void up() { System.out.println("幕布收起"); }
}
外观类
public class HomeTheaterFacade {
private DVDPlayer dvd;
private Projector projector;
private Screen screen;
public HomeTheaterFacade() {
dvd = new DVDPlayer();
projector = new Projector();
screen = new Screen();
}
public void watchMovie() {
System.out.println("准备观看电影...");
screen.down();
projector.on();
dvd.on();
dvd.play();
}
public void endMovie() {
System.out.println("电影结束,关闭设备...");
dvd.off();
projector.off();
screen.up();
}
}
客户端调用
public class Main {
public static void main(String[] args) {
HomeTheaterFacade home = new HomeTheaterFacade();
home.watchMovie();
home.endMovie();
}
}
🧩 优点
- 简化客户端使用,提高系统易用性
- 松散耦合,降低子系统之间依赖
- 更好地组织代码结构
⚠️ 缺点
- 增加额外的外观类
- 可能造成“上帝类”问题(职责过重)
✅ 使用建议
适用于:
- 系统复杂度高、子系统繁多的情况
- 为旧系统封装一层适配接口
- 需要定义入口统一调用多个类的场景