简介
想象你要在家里看电影,需要做以下操作:
- 打开电视
- 启动音响
- 调暗灯光
- 关闭窗帘
如果每次都要手动操作这些步骤会很麻烦。外观模式可以帮你将这些步骤封装成一个统一的接口,比如“一键观影模式”,你只需按一个按钮,系统就会自动完成所有操作。
适用场景
- 简化复杂子系统:当子系统有大量复杂的接口时,用外观模式提供统一入口。
- 分层设计:将子系统划分为多个层次,外观作为每层的入口。
- 减少依赖:客户端只需依赖外观,无需直接调用子系统。
优点
- 简化客户端调用,降低使用复杂度。
- 减少客户端与子系统的耦合,提高灵活性。
- 易于维护,子系统变化只需修改外观类。
缺点
- 外观类可能成为“上帝对象”(过于庞大)。
- 不符合开闭原则,子系统变更可能需要修改外观类。
类图
代码
// 子系统:电视
class TV {
void turnOn() { System.out.println("电视打开"); }
}
// 子系统:音响
class SoundSystem {
void on() { System.out.println("音响启动"); }
}
// 子系统:灯光
class Lighting {
void dim() { System.out.println("灯光调暗"); }
}
// 外观类
class HomeTheaterFacade {
private TV tv;
private SoundSystem sound;
private Lighting lighting;
public HomeTheaterFacade() {
this.tv = new TV();
this.sound = new SoundSystem();
this.lighting = new Lighting();
}
public void watchMovie() {
tv.turnOn();
sound.on();
lighting.dim();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
HomeTheaterFacade facade = new HomeTheaterFacade();
facade.watchMovie();
}
}
案例
文件上传需要:验证文件格式、压缩文件、存储到云服务器。
// 子系统:文件验证
class FileValidator {
void validate(String file) { System.out.println("验证文件: " + file); }
}
// 子系统:压缩工具
class Compressor {
void compress(String file) { System.out.println("压缩文件: " + file); }
}
// 子系统:云存储
class CloudStorage {
void upload(String file) { System.out.println("上传文件: " + file); }
}
// 外观类
class FileUploadFacade {
private FileValidator validator;
private Compressor compressor;
private CloudStorage storage;
public FileUploadFacade() {
this.validator = new FileValidator();
this.compressor = new Compressor();
this.storage = new CloudStorage();
}
public void uploadFile(String file) {
validator.validate(file);
compressor.compress(file);
storage.upload(file);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
FileUploadFacade facade = new FileUploadFacade();
facade.uploadFile("data.csv");
}
}