首页/开发/代码质量与评审速查/外观模式 Facade(结构型)
设计原则与模式62 条

外观模式 Facade(结构型)

为复杂子系统提供简化入口:屏蔽内部协作细节,调用方只面向稳定门面;门面本身不新增业务,保持薄,子系统能力仍可绕过门面单独使用。

外观模式是什么

为复杂子系统提供简化入口:调用方只面向一个稳定的门面接口,内部协作顺序、参数装配、错误归一都在门面里完成。门面本身不新增业务规则,保持薄;子系统能力仍然可以绕过门面单独使用,这一点是它与「把系统封死」的区别。

基本信息

意图简化入口、降低客户端认知负担
原则门面保持薄,不拦截全部可能性
场景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同一接口的替身,控制访问接口不变
门面膨胀成什么都管的上帝类就失去了简化意义:判断标准是门面方法是否只做「按固定顺序编排既有能力」。一旦开始在门面里写业务规则或权限校验,就该把那些职责移回子系统。
门面适合做兼容期入口:新接口上线时保留旧门面转发到新实现,调用方逐步迁移,避免一次性大改带来的风险。

易错点

  • 门面膨胀成上帝类:什么逻辑都往里加,失去简化意义也难测试
  • 门面里做权限与业务校验:职责越界,子系统与门面各有一份规则
  • 门面成为唯一入口:底层能力被封死,高级用法被迫绕路或改门面
  • 每个模块各配一个门面:入口数量与模块相当,简化效果为零

数据来源与参考

  • 《设计模式》(GoF)· Facade
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌