定义


外观模式

为子系统中的一组接口提供一个统一的接口,从而使得子系统更加易用。

实现

// 投影仪
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();

优点

  • 简化接口。
  • 使客户端与子系统解耦。
    缺点
  • 外观类可能过于臃肿,变成上帝类。