课程大纲 / Lesson 07
Facade 结构型

Facade · 门面

为复杂子系统提供一个统一的接口,使得子系统更易于使用。

01

理解门面模式:为复杂子系统提供一个简化的统一入口

02

掌握 Facade 如何封装子系统复杂度,对客户端隐藏细节

03

理解门面模式与适配器模式的区别:门面简化接口,适配器转换接口

04

了解门面模式在视频转换、文件系统等复杂子系统中的应用

核心概念
简化复杂子系统统一入口封装复杂度客户端解耦
classDiagram class videoconversionfacade { <<stateless>> +convert(filename string, format string) string } class videofile { +filename string +codec string +videofile(filename string) } class codecfactory { <<stateless>> +extract(file videofile) string } videoconversionfacade ..> videofile videoconversionfacade ..> codecfactory

外观向客户端提供统一的高层入口,将多个子系统的协作细节封装起来

点击 Run 启动视频转换...
/** 视频文件:包含文件名和编解码器类型 */
public class VideoFile {
    public String filename;
    public String codec;

    public VideoFile(String filename) {
        this.filename = filename;
        this.codec = filename.substring(filename.lastIndexOf(".") + 1);
    }
}
/** 编解码器工厂:根据文件提取编解码器 */
public class CodecFactory {
    public static String extract(VideoFile file) {
        return "MPEG4"; // 模拟提取编解码器
    }
}
/** 门面类:封装视频转换所有子系统,对客户端暴露简单接口 */
public class VideoConversionFacade {
    public String convert(String filename, String format) {
        System.out.println("VideoConversionFacade: conversion started...");
        VideoFile file = new VideoFile(filename);
        String codec = CodecFactory.extract(file);
        System.out.println("Extracting " + codec + " codec...");
        System.out.println("VideoConversionFacade: conversion completed to " + format);
        return filename.replaceAll("\\.\\w+$", "." + format);
    }
}
public class Demo {
    public static void main(String[] args) {
        VideoConversionFacade facade = new VideoConversionFacade();
        String result = facade.convert("funny_video.ogg", "mp4");
        System.out.println("Output file: " + result);
    }
}
◈

门面简化复杂子系统

VideoConversionFacade 将视频编解码、音频处理等多个类封装为一行 convert() 调用,客户端无需了解 CodecFactory、AudioMixer 等子系统的细节。

◈

客户端与子系统解耦

客户端只依赖 Facade,不依赖具体子系统类;子系统变化时只需修改 Facade,不影响客户端代码。

◈

Facade 不限制直接访问

门面不拦阻止客户端直接访问子系统类(GoF 原话),高级场景下仍可绕开 Facade 使用子系统。

◈

门面 vs. 适配器 vs. 装饰器

门面:简化/统一入口(结构型);适配器:接口转换(结构型);装饰器:动态增加功能(结构型)。三者都包装已有类,但目的不同。