外观模式

结构型模式

访问次数: 12

外观模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。

类图
classDiagram
    class Facade {
        -subsystemA: SubsystemA
        -subsystemB: SubsystemB
        -subsystemC: SubsystemC
        +operation()
    }
    class SubsystemA {
        +operationA()
    }
    class SubsystemB {
        +operationB()
    }
    class SubsystemC {
        +operationC()
    }
    class Client {
        -facade: Facade
        +doSomething()
    }
    Facade --> SubsystemA
    Facade --> SubsystemB
    Facade --> SubsystemC
    Client --> Facade
源代码示例
// 子系统A
class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA operationA");
    }
}

// 子系统B
class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB operationB");
    }
}

// 子系统C
class SubsystemC {
    public void operationC() {
        System.out.println("SubsystemC operationC");
    }
}

// 外观类
class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;
    
    public Facade() {
        this.subsystemA = new SubsystemA();
        this.subsystemB = new SubsystemB();
        this.subsystemC = new SubsystemC();
    }
    
    public void operation() {
        System.out.println("Facade operation");
        subsystemA.operationA();
        subsystemB.operationB();
        subsystemC.operationC();
    }
}

// 客户端
class Client {
    private Facade facade;
    
    public Client() {
        this.facade = new Facade();
    }
    
    public void doSomething() {
        facade.operation();
    }
}
# Python代码待添加
应用场景
当需要为复杂的子系统提供一个简单的接口时。应用场景包括: 1)家庭影院系统,需要控制电视、音响、DVD播放器等设备,通过外观模式提供一键开启电影模式的简单接口 2)银行系统,将复杂的账户管理、转账、贷款等子系统封装成简单的用户操作接口 3)电商平台,将商品管理、订单处理、支付、物流等复杂子系统封装成统一的购物接口 4)操作系统API,将底层的文件系统、网络、内存管理等复杂操作封装成简单的系统调用接口 5)游戏引擎,将渲染、物理、音频、输入等子系统封装成简单的游戏开发接口 6)微服务网关,将多个微服务的复杂调用逻辑封装成统一的API网关接口
精选场景详解 —— 家庭影院:一键开启观影模式
问题背景

看电影要依次开电视、切 HDMI、开功放、设环绕声、开 DVD/流媒体。用户不想了解子系统细节,只想「一键观影 / 一键关闭」。

模式如何解决
选用外观(Facade)模式:HomeTheaterFacade 封装对 TV、Amplifier、Player 等子系统的调用顺序,对外提供 watchMovie()、endMovie() 等粗粒度 API。 外观不增加新能力,而是降低子系统使用复杂度,为上层提供稳定入口。子系统类仍可被高级用户直接调用。 与适配器区别:适配器重在「接口转换」;外观重在「简化一组接口」。电商下单门面、API 网关也是同类思想。
场景模型(角色映射)

将模式中的抽象角色映射到该业务领域的具体类:

classDiagram
    class HomeTheaterFacade {
        -tv: Television
        -amp: Amplifier
        -player: StreamingPlayer
        +watchMovie(name: String)
        +endMovie()
    }
    class Television {
        +on()
        +setInput(source: String)
    }
    class Amplifier {
        +on()
        +setSurroundSound()
        +setVolume(level: int)
    }
    class StreamingPlayer {
        +on()
        +play(title: String)
        +stop()
    }
    class User {
        +enjoyMovie()
    }
    HomeTheaterFacade --> Television
    HomeTheaterFacade --> Amplifier
    HomeTheaterFacade --> StreamingPlayer
    User --> HomeTheaterFacade