CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / DESIGN_PATTERNS / P-107 · 设计模式

设计模式 013:外观(Facade)

意图

提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。

类图

classDiagram
    class Client
    class Facade {
        -subSystem SubSystem
        +watchMovie() void
    }
    class SubSystem {
        +turnOnTV() void
        +setCD(cd String) void
        +starWatching() void
    }
    Client ..> Facade : 只依赖外观
    Facade o-- SubSystem : 封装子系统

外观模式为子系统中的一组接口提供一个高层接口,客户端只需和外观对象交互,无需了解子系统内部的复杂调用关系。

实现

观看电影需要操作很多电器,使用外观模式实现一键看电影功能:

public class SubSystem {
    public void turnOnTV() {
        System.out.println("turnOnTV()");
    }

    public void setCD(String cd) {
        System.out.println("setCD( " + cd + " )");
    }

    public void starWatching() {
        System.out.println("starWatching()");
    }
}

public class Facade {
    private SubSystem subSystem = new SubSystem();

    public void watchMovie() {
        subSystem.turnOnTV();
        subSystem.setCD("a movie");
        subSystem.starWatching();
    }
}

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.watchMovie();
    }
}

体现的设计原则

最少知识原则(迪米特法则):只和你的密友谈话。也就是说客户对象所需要交互的对象应当尽可能少。详见 SOLID 设计原则中的迪米特法则一节。

实际应用

  • Spring 的 JdbcTemplate 封装了 ConnectionStatementResultSet 等一系列 JDBC 操作
  • SLF4J 作为日志门面封装了底层日志实现(见日志类库详解
  • 各种”XXManager”、“XXService”的聚合入口多数是外观思想的应用

系列导航

← Angular 22+ 教程 13:组件生命周期钩子 目录 软件工程 013:面向工程管理:极限编程(XP) →
← 返回文章列表