10、外观模式(Facade Pattern,不常用)

外观模式(Facade Pattern)也叫作门面模式,通过一个门面(Facade)向客户端提供一个访问系统的统一接口,客户端无须关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要目的是降低访问拥有多个子系统的复杂系统的难度,简化客户端与其之间的接口。外观模式将子系统中的功能抽象成一个统一的接口,客户端通过这个接口访问系统,使得系统使用起来更加容易。

简单来说,外观模式就是将多个子系统及其之间的复杂关系和调用流程封装到一个统一的接口或类中以对外提供服务。这种模式涉及3种角色。

  • 子系统角色:实现了子系统的功能。
  • 门面角色:外观模式的核心,熟悉各子系统的功能和调用关系并根据客户端的需求封装统一的方法来对外提供服务。
  • 客户角色:通过调用Facade来完成业务功能。

以汽车的启动为例,只需按下启动按钮,后台就会自动完成引擎启动、仪表盘启动、车辆自检等过程。通过外观模式将汽车启动这一系列流程封装到启动按钮上,对于用户来说只需按下启动按钮即可,不用太关心具体的细节。UML设计图如下:

1)定义Engine类:

java 复制代码
@Slf4j
public class Engine {
    public void startup() {
        log.info("engine startup...");
    }

    public void shutdown() {
        log.info("engine shutdown...");
    }
}

2)定义Dashboard类:

java 复制代码
@Slf4j
public class Dashboard {
    public void startup() {
        log.info("dashboard startup...");
    }

    public void shutdown() {
        log.info("dashboard shutdown...");
    }
}

3)定义SelfCheck类:

java 复制代码
@Slf4j
public class SelfCheck {
    public void startup() {
        log.info("SelfCheck startup...");
    }

    public void shutdown() {
        log.info("SelfCheck shutdown...");
    }
}

4)定义门面类Starter封装Engine、Dashboard、SelfCheck:

java 复制代码
package cn.jaa.facade_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description: 启动按钮
 * @Date 2023/11/30
 */
@Slf4j
public class Starter {

    private Engine engine;
    private Dashboard dashboard;
    private SelfCheck selfCheck;

    public Starter() {
        this.engine = new Engine();
        this.dashboard = new Dashboard();
        this.selfCheck = new SelfCheck();
    }

    public void startup() {
        log.info("====car begin startup====");
        engine.startup();
        dashboard.startup();
        selfCheck.startup();
        log.info("====car startup finished====");
    }

    public void shutdown() {
        log.info("====car begin shutdown====");
        engine.shutdown();
        dashboard.shutdown();
        selfCheck.shutdown();
        log.info("====car shutdown finished====");
    }
}

5)测试外观模式:

java 复制代码
package cn.jaa.facade_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description: 外观模式测试类
 * @Date 2023/11/30
 */
@Slf4j
public class FacadeDemoTest {
    public static void main(String[] args) {
        Starter starter = new Starter();
        // 启动汽车
        starter.startup();
        // 熄灭汽车
        starter.shutdown();
    }
}

运行结果:

相关推荐
qq_297574678 小时前
设计模式系列文章(基础篇第19篇):中介者模式——封装交互关系,解耦网状依赖
设计模式·交互·中介者模式
AI大法师9 小时前
老牌媒体怎么从“出版物更新”走到“品牌系统升级”
大数据·人工智能·设计模式·新媒体运营
野生技术架构师9 小时前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式
艾利克斯冰9 小时前
Java设计模式-创建型模式(更新完成)
设计模式
王_teacher10 小时前
23种设计模式之工厂模式
设计模式·软件工程·简单工厂模式·工厂方法模式·抽象工厂模式
geovindu10 小时前
python:Coroutines Pattern
开发语言·python·设计模式·协程模式
sycmancia12 小时前
Qt——模型视图设计模式
设计模式
玖玥拾1 天前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
geovindu1 天前
go: Broadcast Pattern
开发语言·后端·设计模式·golang·广播模式
我爱cope1 天前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展