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

运行结果:

相关推荐
菜鸟一枚在这2 小时前
深入理解设计模式之代理模式
java·设计模式·代理模式
mjr4 小时前
设计模式-Java
java·设计模式
yuanpan4 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
FLZJ_KL6 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
万兴丶8 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这9 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
码熔burning9 小时前
(三)趣学设计模式 之 抽象工厂模式!
设计模式·抽象工厂模式
程序猿多布10 小时前
C#设计模式 学习笔记
设计模式·c#
強云14 小时前
23种设计模式 - 模板方法
设计模式·模板方法
workflower20 小时前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程