为复杂子系统提供一个统一的接口,使得子系统更易于使用。
理解门面模式:为复杂子系统提供一个简化的统一入口
掌握 Facade 如何封装子系统复杂度,对客户端隐藏细节
理解门面模式与适配器模式的区别:门面简化接口,适配器转换接口
了解门面模式在视频转换、文件系统等复杂子系统中的应用
外观向客户端提供统一的高层入口,将多个子系统的协作细节封装起来
/** 视频文件:包含文件名和编解码器类型 */
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,不影响客户端代码。
门面不拦阻止客户端直接访问子系统类(GoF 原话),高级场景下仍可绕开 Facade 使用子系统。
门面:简化/统一入口(结构型);适配器:接口转换(结构型);装饰器:动态增加功能(结构型)。三者都包装已有类,但目的不同。