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();
    }
}

运行结果:

相关推荐
lxyzcm11 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千11 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)11 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲13 小时前
设计模式——桥接模式
设计模式·桥接模式
捕鲸叉17 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
小小小妮子~17 小时前
框架专题:设计模式
设计模式·框架
先睡17 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Damon_X1 天前
桥接模式(Bridge Pattern)
设计模式·桥接模式
越甲八千1 天前
重温设计模式--享元模式
设计模式·享元模式
码农爱java1 天前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式