外观模式(Facade Pattern)学习笔记
🌟 定义
外观模式属于结构型设计模式,提供一个统一的接口来访问子系统中的多个接口。它通过定义一个高层接口简化客户端与复杂子系统的交互。
🎯 适用场景
- 为复杂子系统提供简单入口
- 解耦客户端与子系统
- 分层构建系统(各层通过外观类交互)
- 遗留系统重构(用外观类封装旧接口)
🔧 模式结构
📐 类图
🛠️ 核心组成
-
Facade(外观角色)
- 知道子系统功能
- 将客户端请求委派给对应子系统对象
-
Subsystem Classes(子系统角色)
- 实现子系统具体功能
- 不感知外观存在(可独立运行)
📝 代码示例
家庭影院场景
// 子系统类
class Lights {
void dim() { System.out.println("灯光调暗"); }
}
class SoundSystem {
void on() { System.out.println("音响开启"); }
}
class Projector {
void down() { System.out.println("幕布降下"); }
}
// 外观类
class HomeTheaterFacade {
private Lights lights;
private SoundSystem sound;
private Projector projector;
public HomeTheaterFacade() {
this.lights = new Lights();
this.sound = new SoundSystem();
this.projector = new Projector();
}
public void watchMovie() {
lights.dim();
sound.on();
projector.down();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
HomeTheaterFacade facade = new HomeTheaterFacade();
facade.watchMovie(); // 一键启动观影模式
}
}
✅ 优点
- 简化客户端使用复杂度
- 客户端与子系统松耦合
- 更好的访问控制(可限制直接访问子系统)
- 符合迪米特法则(最少知识原则)
⚠️ 缺点
- 过度使用会导致系统层级过多
- 增加维护成本(修改子系统可能需调整外观)
- 可能成为"上帝对象"(需注意职责划分)
🔄 相关模式对比
模式 | 区别 |
---|---|
中介者模式 | 关注子系统间的通信协调 |
单例模式 | 外观类常实现为单例 |
抽象工厂模式 | 可与外观结合封装创建过程 |
💡 实践建议
- 优先考虑子系统重构而不是外观包装
- 保持外观类的单一职责
- 可创建多个外观类对应不同使用场景
- 通过依赖注入管理子系统对象
掌握外观模式的关键在于理解它作为系统门户的定位,合理使用可以显著提升系统的易用性和可维护性。