结构型:门面模式(外观模式)

发布于:2025-05-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景


1、核心思想

目的:通过高层接口(门面类)封装多个子系统的复杂交互,客户端只需与门面交互,简化入口;同时隔离客户端与子系统,子系统的修改不影响客户端代码,实现解耦

举例

1> 早期的相机使用起来是非常麻烦的,拍照前总是要根据场景情况进行一系列复杂的操作,如对焦、调节闪光灯、调光圈等,非专业人士面对这么一大堆的操作按钮根本无从下手,拍出来的照片质量也不高。随着科技发展,出现“傻瓜相机”,用户再也不必学习那些复杂的参数调节了,只要按下快门键就可完成所有操作。

2> 自动挡汽车对离合及换挡操作的封装

3> 全自动洗衣机对浸泡、漂洗、甩干、排水等一系列操作的封装

2、实现方式

2.1 模式结构

  • Facade(外观门面)​:封装了多个子系统,并将它们整合起来对外提供统一的访问接口。
  • SubSystemA、SubSystemB、SubSystemC(子系统A、子系统B、子系统C)​:隐藏于门面中的子系统,数量任意,且对外部不可见,可直接调用或者通过门面调用。

2.2 实现案例

假设一个智能家居包含灯光、空调、音响等设备,启动“观影模式”需依次执行以下操作:关灯、开空调并调至26℃、开音响并切换到电影模式。

// 子系统
class Light { void off() { /* 关灯 */ } }
class AirConditioner { void on(int temp) { /* 开空调 */ } }
class SoundSystem { void movieMode() { /* 音响电影模式 */ } }

// 门面类
class HomeTheaterFacade {
    private Light light;
    private AirConditioner ac;
    private SoundSystem sound;

    public HomeTheaterFacade() {
        light = new Light();
        ac = new AirConditioner();
        sound = new SoundSystem();
    }

    public void startMovie() {
        light.off();
        ac.on(26);
        sound.movieMode();
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade facade = new HomeTheaterFacade();
        facade.startMovie(); // 一键启动观影模式
    }
}

3、优缺点分析

优点:

  1. 简化客户端使用:隐藏复杂性,提供清晰接口。

  2. 降低耦合:客户端仅依赖门面,子系统变化时只需调整门面。

  3. 提高灵活性:可自由替换或扩展子系统,不影响客户端。

缺点:

  1. 过度集中风险:若门面类过于庞大,可能成为“上帝对象”。

  2. 灵活性受限:若需要定制化操作,仍需绕过门面直接调用子系统。

4、适用场景

  • 复杂子系统整合:为遗留系统或第三方库提供简洁接口。

  • 分层架构设计:每层通过门面对外暴露功能。

  • 简化常用流程:如订单支付、用户注册等涉及多步骤的操作。