Skip to content

外观模式

外观模式(Facade Pattern) 是一种 结构型设计模式,它为一个复杂的子系统提供一个统一的高层接口,使得子系统更容易使用。

核心

  1. 依赖倒转原则
  2. 迪米特法则

使用场景

使用场景描述示例说明
简化复杂接口的使用当一个系统由多个类组成,接口复杂难懂时,可以通过外观类封装这些接口,对外提供简洁 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();
    }
}
最近更新