Skip to content

外观模式(Facade)是最简单也最实用的模式之一:提供一个统一入口,屏蔽内部子系统的复杂调用。客户端只跟"外观"打交道,不用管背后有多少个类在协作。这篇讲清它怎么简化调用。

一、解决什么问题:子系统调用复杂

一个操作可能涉及多个子系统协作。比如"电脑开机",要依次启动 CPU、内存、硬盘:

java
// 不用外观:客户端要记住开机的一堆步骤和顺序
CPU cpu = new CPU();
Memory memory = new Memory();
Disk disk = new Disk();
cpu.start();
memory.load();
disk.read();
// 每个用到开机的地方都要写这一串,漏一步就出错

外观模式:把这些步骤封装成一个"外观"类,客户端只调一个方法。

二、核心结构

java
// 子系统(多个,各自复杂)
class CPU { void start() { System.out.println("CPU 启动"); } }
class Memory { void load() { System.out.println("内存加载"); } }
class Disk { void read() { System.out.println("硬盘读取"); } }

// 外观:统一入口,封装开机的一串步骤
class Computer {
    private CPU cpu = new CPU();
    private Memory memory = new Memory();
    private Disk disk = new Disk();

    public void start() {          // 一个方法搞定
        cpu.start();
        memory.load();
        disk.read();
    }
}

// 客户端:只跟外观打交道,不用管内部几个子系统
new Computer().start();

关键:客户端从"调 3 个类、记 3 步顺序"简化成"调 1 个方法"。子系统内部怎么协作、顺序是什么,客户端完全不关心。

三、核心价值

  • 简化调用:复杂子系统 → 一个入口
  • 降低耦合:客户端只依赖外观,不依赖一堆子系统
  • 隔离变化:子系统改了,只需改外观,客户端不动

四、实际应用

  • SLF4J:统一日志门面,屏蔽 log4j/logback 的差异(你写 slf4j 接口,换实现不用改代码)
  • JdbcTemplate:Spring 封装 JDBC 的一堆样板(连接、Statement、异常处理),你只调一个 query
  • 网关/门面服务:微服务里对外提供一个统一入口

小结

  • 外观 = 统一入口,屏蔽子系统的复杂调用
  • 客户端只调外观,不管内部协作细节
  • 典型:SLF4J 日志门面、JdbcTemplate、网关

相关:《适配器模式》(外观是"简化",适配器是"转换",两者容易混)。