门面模式 Facade Pattern

简介: 主要内容有:该模式的介绍,包括:引子、意图(大白话解释)类图、时序图(理论规范)该模式的代码示例:熟悉该模式的代码长什么样子该模式的优缺点:模式不是万金油,不可以滥用模式该模式的应用案例:了解它在哪些重要的源码中被使用


前言



主要内容有:

  • 该模式的介绍,包括:
  • 引子、意图(大白话解释)
  • 类图、时序图(理论规范)
  • 该模式的代码示例:熟悉该模式的代码长什么样子
  • 该模式的优缺点:模式不是万金油,不可以滥用模式
  • 该模式的应用案例:了解它在哪些重要的源码中被使用


结构型——外观模式、门面模式 Facade Pattern



引子

门面模式便是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。

比如用户是用电脑,电脑有操作:开机关机重启等。每个操作里都有复杂的逻辑,比如开始需要先启动BIOS-引导硬盘—进入系统-初始化桌面等。对于使用者来说,只需要调用开机的方法。

定义


门面模式( Facade Pattern) 也叫做外观模式, 是一种比较常用的封装模式,

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.( 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。 门面模式提供一个高层次的接口, 使得子系统更易于使用。 )


类图

如果看不懂UML类图,可以先粗略浏览下该图,想深入了解的话,可以继续谷歌,深入学习:

门面模式类图:

  • 客户角色(Client): 客户通过调用Facede来完成要实现的功能。
  • 门面角色(Facade):它被客户角色调用,并且知道自己管理着的子系统。内部根据客户角色的需求预定了几种功能的组合。
  • 子系统角色(SystemA/B/C):实现了子系统的功能。它对客户角色是完全透明的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。


时序图

时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。时序图中显示的是参与交互的对象及其对象之间消息交互的顺序。

我们可以大致浏览下时序图,如果感兴趣的小伙伴可以去深究一下:


代码实现

门面Facade:

public class Computer
{
    public static final Logger LOGGER = Logger.getLogger(Computer.class);
    private CPU cpu;
    private Memory memory;
    private Disk disk;
    public Computer()
    {
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }
    public void start()
    {
        LOGGER.info("Computer start begin");
        cpu.start();
        disk.start();
        memory.start();
        LOGGER.info("Computer start end");
    }
    public void shutDown()
    {
        LOGGER.info("Computer shutDown begin");
        cpu.shutDown();
        disk.shutDown();
        memory.shutDown();
        LOGGER.info("Computer shutDown end...");
    }
}
复制代码

客户端调用Client:

public class Client
{
    public static final Logger LOGGER = Logger.getLogger(Client.class);
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.start();
        computer.shutdown();
    }
复制代码

对于用户来说,使用Client完全不需要关心底层细节。


使用场景举例


典型例子:SLF4J 中的外观模式

SLF4J 是简单的日志外观模式框架,抽象了各种日志框架例如 Logback、Log4j、Commons-logging 和 JDK 自带的 logging 实现接口。它使得用户可以在部署时使用自己想要的日志框架。

SLF4J 没有替代任何日志框架,它仅仅是标准日志框架的外观模式。如果在类路径下除了 SLF4J 再没有任何日志框架,那么默认状态是在控制台输出日志。


spring jdbc中的外观模式

查看 org.springframework.jdbc.support.JdbcUtils


Mybatis中的外观模式

查看 org.apache.ibatis.session.Configuration 类中以 new 开头的方法

public class Configuration {
    public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
        executorType = executorType == null ? defaultExecutorType : executorType;
        executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
        Executor executor;
        if (ExecutorType.BATCH == executorType) {
          executor = new BatchExecutor(this, transaction);
        } else if (ExecutorType.REUSE == executorType) {
          executor = new ReuseExecutor(this, transaction);
        } else {
          executor = new SimpleExecutor(this, transaction);
        }
        if (cacheEnabled) {
          executor = new CachingExecutor(executor);
        }
        executor = (Executor) interceptorChain.pluginAll(executor);
        return executor;
    }
    public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
          ResultHandler resultHandler, BoundSql boundSql) {
        ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
        resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
        return resultSetHandler;
    }
    // ...省略...
}
复制代码


Tomcat 中的外观模式

org.apache.catalina.connector.Request 和 org.apache.catalina.connector.RequestFacade 这两个类都实现了 HttpServletRequest 接口


优缺点

优点

  • 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
  • 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
  • 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。

缺点

  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。


参考



相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
1月前
|
域名解析 人工智能 安全
阿里云企业邮箱登陆链接入口、免费邮箱申请及云邮箱官网,一键直达
阿里云企业邮箱提供免费版(需域名+实名认证)及标准版、AI尊享版、国产化版三类付费方案(5账号/年起,600–900元/年)。本文汇总官方登录入口、免费申请链接、管理控制台及@aliyun.com个人邮箱地址,附操作指引与价格详情。企业邮箱官网:https://t.aliyun.com/U/gNeTEB 企业邮箱提供免费版和收费版
|
2月前
|
人工智能 JSON 自然语言处理
如何使用千问生成你的第一部AI短剧:基于千问大模型的全流程实践与变现路径拆解
本文详解AI短剧工业化落地路径:以通义千问为核心,拆解从剧本生成、视觉制作到后期合成的低成本SOP,单部5分钟短剧成本仅约50元;涵盖平台分账、品牌定制、私域服务等多元变现模式,并附实战提示词模板与合规避坑指南,助力零基础创作者快速入局变现。
|
3月前
|
Arthas 监控 Java
字节码增强原理:Java Agent + ASM 实战,Arthas 底层揭秘
Arthas 凭什么不重启就能改代码?本文从字节码增强的三种思路讲起,拆解 Java Agent + ASM 底层原理,手写迷你版热更新
字节码增强原理:Java Agent + ASM 实战,Arthas 底层揭秘
|
3月前
|
存储 算法
Tushare接口文档:复权因子(adj_factor)
本文介绍的复权因子是“累计后复权因子”,存储的是每个交易日的快照。本文介绍了如何获取某个交易日全市场股票的复权因子、如何获取单只股票最近6000条复权因子、如何获取某段时间区间里的复权因子以及如何计算前复权和后复权价格。
617 8
|
2月前
|
SQL 关系型数据库 MySQL
误UPDATE清零十万条余额,47分钟靠binlog全量救回
从一次误UPDATE全表清零余额的事故切入,解析binlog ROW格式的恢复原理,附mysqlbinlog精确时间点提取脚本,以及my2sql、lightning等8.0可用闪回工具的实战用法
|
2月前
|
存储 监控 API
DashVector向量数据库全解:功能特性、API调用与百炼RAG集成
DashVector是阿里云原生向量检索服务,与百炼平台深度集成。本文详解DashVector核心功能、API调用方法和RAG应用集成实践,助你快速构建向量检索应用。
271 0
|
机器学习/深度学习 算法 数据挖掘
足球比赛的镜头如何变成数据:从视频分析到实时数据应用
足球视频分析利用计算机视觉与深度学习技术,将比赛镜头转化为球员位置、动作及赛事事件等结构化数据,助力战术制定、表现评估与观赛体验升级,推动体育智能化发展。
|
4月前
|
数据采集 监控 搜索推荐
网站如何检测并封禁恶意爬虫?用IP离线库从访问频率到行为分析全搞定
本文介绍一种毫秒级反爬方案:基于IP离线库,通过net_type(识别90%+违规的数据中心IP)、proxy_type(穿透住宅代理伪装)、risk_score(0–100风险量化)及行为分析四层递进识别,在请求到达瞬间完成IP定性与风险决策,拦截率提升至96%,误拦率降至0.4%,服务器负载下降超50%。(239字)
367 0
|
5月前
|
存储 固态存储 网络安全
一文弄懂游戏出海服务器
游戏出海服务器选型关键:低延迟、高稳定、强防御、大带宽。港服因兼顾大陆(10–40ms)与东南亚访问、免备案、CN2 GIA优质线路及高防能力,成亚洲市场首选。线路质量往往比硬件配置更重要。
451 5
|
存储 JSON API
Elasticsearch Pipeline 详解
Elasticsearch Pipeline 详解
1130 0

热门文章

最新文章