定义
外观模式
为子系统中的一组接口提供一个统一的接口,从而使得子系统更加易用。
实现
// 投影仪
public class Projector {
public void on() { System.out.println("投影仪打开"); }
public void off() { System.out.println("投影仪关闭"); }
public void setWideScreen() { System.out.println("投影仪设为宽屏模式"); }
}
// 音响
public class SoundSystem {
public void on() { System.out.println("音响打开"); }
public void off() { System.out.println("音响关闭"); }
public void setVolume(int v) { System.out.println("音响音量设为 " + v); }
}
// DVD 播放器
public class DvdPlayer {
public void on() { System.out.println("DVD 播放器打开"); }
public void off() { System.out.println("DVD 播放器关闭"); }
public void play(String movie) { System.out.println("正在播放: " + movie); }
public void stop() { System.out.println("停止播放"); }
}
// 灯光
public class Lights {
public void dim(int level) { System.out.println("灯光调暗至 " + level + "%"); }
public void on() { System.out.println("灯光打开"); }
}
public class HomeTheaterFacade {
private Projector projector;
private SoundSystem sound;
private DvdPlayer dvd;
private Lights lights;
public HomeTheaterFacade(Projector projector, SoundSystem sound,
DvdPlayer dvd, Lights lights) {
this.projector = projector;
this.sound = sound;
this.dvd = dvd;
this.lights = lights;
}
// 一键观影
public void watchMovie(String movie) {
System.out.println("=== 准备观影 ===");
lights.dim(30);
projector.on();
projector.setWideScreen();
sound.on();
sound.setVolume(80);
dvd.on();
dvd.play(movie);
}
// 一键关闭
public void endMovie() {
System.out.println("=== 关闭影院 ===");
dvd.stop();
dvd.off();
sound.off();
projector.off();
lights.on();
}
}
// 注入theater
theater.watchMovie("肖申克的救赎");
theater.endMovie();优点:
- 简化接口。
- 使客户端与子系统解耦。
缺点: - 外观类可能过于臃肿,变成上帝类。