外观模式
外观模式(Facade Pattern) 是一种 结构型设计模式,它为一个复杂的子系统提供一个统一的高层接口,使得子系统更容易使用。
核心
- 依赖倒转原则
- 迪米特法则
使用场景
使用场景描述 | 示例说明 |
---|---|
简化复杂接口的使用 | 当一个系统由多个类组成,接口复杂难懂时,可以通过外观类封装这些接口,对外提供简洁 API。 |
降低客户端与子系统的耦合度 | 客户端无需知道子系统内部如何工作,只需要调用外观方法即可。 |
分层架构中的接口抽象 | 在多层架构中,上层模块通过外观来访问下层模块的功能,避免直接依赖底层实现。 |
遗留系统封装 | 将旧系统的复杂接口封装成一个新的简单接口,便于新系统集成。 |
第三方库或 API 的封装 | 对外部库进行封装,屏蔽其复杂性,提供更符合业务需求的接口。 |
示例:
java
class DVDPlayer {
public void on() { System.out.println("DVD Player is ON"); }
public void play(String movie) { System.out.println("Playing movie: " + movie); }
public void off() { System.out.println("DVD Player is OFF"); }
}
class Projector {
public void on() { System.out.println("Projector is ON"); }
public void setResolution(String res) { System.out.println("Set resolution to " + res); }
public void off() { System.out.println("Projector is OFF"); }
}
class SoundSystem {
public void on() { System.out.println("Sound System is ON"); }
public void setVolume(int volume) { System.out.println("Volume set to " + volume); }
public void off() { System.out.println("Sound System is OFF"); }
}
class LightController {
public void dim(int level) { System.out.println("Lights dimmed to " + level + "%"); }
public void on() { System.out.println("Lights are ON"); }
}
java
class HomeTheaterFacade {
private DVDPlayer dvdPlayer;
private Projector projector;
private SoundSystem soundSystem;
private LightController lightController;
public HomeTheaterFacade(DVDPlayer dvdPlayer, Projector projector,
SoundSystem soundSystem, LightController lightController) {
this.dvdPlayer = dvdPlayer;
this.projector = projector;
this.soundSystem = soundSystem;
this.lightController = lightController;
}
// 一键观影
public void watchMovie(String movie) {
System.out.println("== Starting to watch movie: " + movie + " ==");
lightController.dim(10);
projector.on();
projector.setResolution("1080p");
soundSystem.on();
soundSystem.setVolume(20);
dvdPlayer.on();
dvdPlayer.play(movie);
}
// 结束观影
public void endMovie() {
System.out.println("== Ending the movie ==");
dvdPlayer.off();
soundSystem.off();
projector.off();
lightController.on();
}
}
java
public class Client {
public static void main(String[] args) {
DVDPlayer dvd = new DVDPlayer();
Projector projector = new Projector();
SoundSystem sound = new SoundSystem();
LightController lights = new LightController();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvd, projector, sound, lights);
// 一键观影
homeTheater.watchMovie("Inception");
// 结束观影
homeTheater.endMovie();
}
}