外观模式是什么
为复杂子系统提供简化入口:调用方只面向一个稳定的门面接口,内部协作顺序、参数装配、错误归一都在门面里完成。门面本身不新增业务规则,保持薄;子系统能力仍然可以绕过门面单独使用,这一点是它与「把系统封死」的区别。
基本信息
| 意图 | 简化入口、降低客户端认知负担 |
|---|---|
| 原则 | 门面保持薄,不拦截全部可能性 |
| 场景 | SDK 入口、启动引导、跨模块编排、跨系统调用 |
| 相关 | 适配器转换接口,中介者管理中心化协作 |
典型使用场景
- SDK 提供一键式入口:调用方不必了解内部模块顺序
- 启动引导:依次完成配置加载、连接初始化、健康检查
- 跨模块编排:一个业务动作涉及多个子系统的固定调用顺序
- 把多个外部服务聚合成一次调用,返回统一结果结构
- 为集成方提供稳定入口,同时保留底层能力供高级用法直接调用
Java 示例
Java 示例
class VideoFacade {
private final CodecFactory codecs;
private final AudioMixerFactory mixers;
VideoFacade(CodecFactory codecs, AudioMixerFactory mixers) {
this.codecs = codecs;
this.mixers = mixers;
}
// 调用方只表达意图,内部步骤由门面承担
File convert(File src, String fmt) {
Codec codec = codecs.forFormat(fmt);
AudioMixer mixer = mixers.forCodec(codec);
return mixer.render(src, codec);
}
}与邻近模式的区别
| 模式 | 意图 | 是否保留原接口 |
|---|---|---|
| Facade | 简化入口,隐藏子系统的协作细节 | 保留,底层仍可直接用 |
| Adapter | 把不兼容的接口转成期望的接口 | 被适配方接口不变 |
| Mediator | 把多对象之间的交互集中到中介者 | 对象之间不再直接引用 |
| Proxy | 同一接口的替身,控制访问 | 接口不变 |
门面膨胀成什么都管的上帝类就失去了简化意义:判断标准是门面方法是否只做「按固定顺序编排既有能力」。一旦开始在门面里写业务规则或权限校验,就该把那些职责移回子系统。
门面适合做兼容期入口:新接口上线时保留旧门面转发到新实现,调用方逐步迁移,避免一次性大改带来的风险。