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

运行结果:

相关推荐
408高手9 小时前
23种设计模式
设计模式
沫璃染墨9 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
sarasuki19 小时前
MCP 为什么是一个协议而不是一个框架呢?
设计模式·agent·mcp
geovindu1 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
染指11102 天前
140.Agent-多Agent框架-Agent执行Skills流程
数据库·人工智能·设计模式·langchain·agents
sarasuki2 天前
Agent 是怎么做错误处理的呢?
人工智能·设计模式·agent
A1Book2 天前
从 0 设计历史专题资料汇编的 AI Agent 编排架构——六轮真实任务复盘
设计模式
geovindu3 天前
rust: Simple Factory Pattern(续)
后端·设计模式·rust·简单工厂模式·创建型模式
喜欢coding的谢同学3 天前
Go语言常用设计模式基础和实践案例介绍
开发语言·设计模式·golang
sarasuki4 天前
Agent 的记忆有几种?你的名字是?
人工智能·设计模式·agent