12.设计模式之门面模式

news2024/11/28 11:45:07

前言

门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。日志框架slf4J是门面模式最经典的应用场景

本节,我们就门面模式,展开详细介绍。

1. 门面模式中的角色

1.1 门面角色(Facade)

客户端可以调用这个角色的方法。此角色知晓相关的(一个或多个)子系统的的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

1.2 子系统角色(Subsystem)

可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端而已。

2. 代码示例

2.1 定义门面角色

package com.wanlong.design_pattern.structure.facade;

/**
 * @author wanlong
 * @version 1.0
 * @description: 门面角色
 * @date 2022/9/19 16:31
 */
public class Facade {
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    private SubSystemC c = new SubSystemC();

    //对外接口
    public void doA() {
        this.a.doA();
    }

    //对外接口
    public void doB() {
        this.b.doB();
    }

    //对外接口
    public void doC() {
        this.c.doC();
    }
}

2.2 定义子系统角色

2.2.1 定义子系统A

package com.wanlong.design_pattern.structure.facade;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/19 16:30
 */
public class SubSystemA {

    public void doA(){
        System.out.println("doing A stuff");
    }
}

2.2.2 定义子系统B

package com.wanlong.design_pattern.structure.facade;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/19 16:30
 */
public class SubSystemB {

    public void doB() {
        System.out.println("doing B stuff");
    }
}

2.2.3 定义子系统C

package com.wanlong.design_pattern.structure.facade;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/19 16:30
 */
public class SubSystemC {

    public void doC(){
        System.out.println("doing C stuff");
    }
}

2.4 客户端调用

@Test
public void testFacade(){

   Facade facade = new Facade();
   facade.doA();
   facade.doB();
   facade.doC();
}

代码运行结果:

doing A stuff
doing B stuff
doing C stuff

3. 总结

3.1 优缺点

3.1.1 优点

  1. 简化了调用过程,无需深入了解子系统,以防给子系统带来风险。
  2. 减少系统依赖、松散耦合
  3. 更好地划分访问层次,提高了安全性
  4. 遵循迪米特法则,即最少知道原则

3.1.2 缺点

  1. 增加子系统和扩展系统行为时,可能容易带来未知风险
  2. 不符合开闭原则
  3. 某些情况下可能违背单一职责原则

3.2 使用场景

问:在什么情况下可以使用门面模式?
答:为一个复杂子系统提供一个简单接口

子系统往往因为不断演化而变的越来越复杂,使用门面模式可以使得子系统更具有可复用性。Facade模式可以提供一个简单的默认视图,对大多数用户来说这个视图已经足够用了。而那些需要进一步继承的用户可以越过Facade层直接对子系统进行继承

一般而言,子系统和其他子系统之间、客户端与实现化层之间存在着很大的依赖性。引入Facade模式将一个子系统与它的客户端及其他子系统分离,可以提高子系统的独立性和可移植性

在构建一个层次化的系统时,可以使用 Facade模式定义系统中每一层的入口如果层与层之间是相互依赖的,则可以限定它们仅通过Facade进行通信,从而简化层与层之间的依赖关系

这有点像现在很多公司系统结构层次,web层访问聚合服务层、聚合服务层访问微服务层、微服务层访问底层dao层、dao层访问DB。类似下图。通过微服务拆分粒度变细,以及分层,正常情况限制服务调用需要层层传递调用,那么在顶层的调用者其实是感知不到具体接口内部有多复杂的,解耦了系统之间的依赖关系
在这里插入图片描述

3.3 常用场景

  1. commons提供的DBUtils
  2. Spring JDBC工具类JdbcUtils
  3. slf4j日志框架使用(门面模式最经典的应用)
  4. tomcat 的请求门面RequestFacadeResponseFacade

3.4 注意

初学者往往以为通过继承一个门面类便可以在系统中加入新的行为,这是不合理的。门面模式的用意是,为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。以医院为例,接待员并不是医护人员,接待员并不能为病人提供医疗服务

4. 扩展文献

关于slf4j实现原理

以上,本人菜鸟一枚,如有问题,请不吝指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.setContentView流程分析

1. setContentView初步分析之继承自Activity 我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下: public void setContentView(LayoutRes int layoutResID) {//这里的getWindow方法获取到一个PhoneWind…

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium,原文地址:https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话,基本上有以下内容: 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题是收集树的叶子节点,而子集问题是找树的所有节点! 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务(Process/Task) 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…

谷歌I/O大会重磅发布:Bard编码能力优化后仍不支持中文,开发者选择CodeGeeX更佳

谷歌I/O大会今天凌晨发布,打出系列AI组合拳。除了发布升级版语言模型PaLM2之外,Bard能力也要起飞。 凭借改进的数学、逻辑和推理技能,Bard 现在可以帮助生成、解释和调试 20 多种编程语言的代码,开发者们需要输入prompt&#xff0…

C#从入门到入坟(原创不易,转载请注明出处)

文章目录 C# 基础篇0 环境部署1 Hello world1.1 两种框架1.2 创建项目的过程1.3 项目组成结构1.3.1 解决方案和项目1.3.2 程序集信息1.3.3 引用1.3.4 配置文件1.3.5 程序入口类 1.4 解决方案1.5 Debug 和 Release1.6 CSharp虚拟机初始1.7 .Net Framework混合语言开发1.8 托管代…

上下文感知的体素对比学习用于标签高效的多器官分割

文章目录 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient Multi-organ Segmentation摘要本文方法有监督损失Context-Aware Contrastive Learning Loss for Unlabeled Voxels 实验结果 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient…

GSMA-eSIM-官网规范说明

GSMA | eSIM Consumer and IoT Specifications - eSIM GSMA | eSIM Consumer and IoT Specifications - eSIMhttps://www.gsma.com/esim/esim-specification/ 架构、测试、技术规范 3.0版本 测试套件 EID的定义和分配 GSMA EID Definition and Assignment 合规性规范 自我评…

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日),包含答案

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日) 一、选择题 第 1 题 单选题 关于Python3.10,下列选项描述正确的是 ( )。 答案:B 第 2 题 单选题 下列数据类型中,哪一个是不可变的?() 答案:B 第 3 题 单选题 以下关于函数参数描述正确的是 ()。 答案:D 第 …

【JAVAEE】文件操作——IO

目录 💋1. 冯诺伊曼体系 🐷2. 内存与外存的区别 ✨3. 文件 🎁3.1 认识文件 ✌3.2 文件的管理 🍳3.3 文件路径 🎃3.4 文件的保存 👑3.4.1 文本文件 📷3.4.2 二进制文件 🎀3.5 文件系…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中,创建集合有两种方式: 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…

Vue3-黑马(九)

目录: (1)vue3-antdv-删除选中 (2)vue3-进阶-antdv-增改 (3)vue3-进阶-antdv-增改2 (1)vue3-antdv-删除选中 我们在表格中在加一列,做一个复选框&#xff…

【一起啃书】《机器学习》第六章 支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …

【YOLO系列】--YOLOv4超详细解读/总结

YOLOv4(YOLOv4: Optimal Speed and Accuracy of Object Detection)(原文+解读/总结+翻译) 系列文章: YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 YOLOv2论文解读/总结_耿鬼…

[免疫学]抗原递呈详解

目录 🧫1. 抗原递呈是什么 🧫1.1 MHCⅠ类分子 🧫1.2 MHCⅡ类分子 🧫1.3 MHCⅠ类分子 分子介导的抗原递呈 🧫1.4 MHCⅡ类分子 分子介导的抗原递呈 🧫1.5 抗原递呈细胞 🧫1.5.1 激活的树突状…

初识Linux篇:第三篇

初识Linux篇:第三篇 初识Linux篇:第三篇1.Linux中常见的通配符1.1*号通配符1.2 ?通配符1.3[ ]通配符1.4{ }通配符 2.man指令3.cp指令4.mv指令5.alias指令6. echo指令7.cat指令8.more指令9.less指令10.head与tail指令11.在Linux中写代码 总结 …

DHCP中继负载均衡使用原理

DHCP常用四种报文 基于UDP67服务端, 68端口客户端 discover 广播 offer 单播 rquest 广播 ack 单播 DHCP 50%时间续租时request报文为单播报文 DHCP 87.5%时间请求重新绑定IP时request报文为广播报文 DHCP的另类配置方案: 负载均衡: ip re…

【Python_Pandas】reset_index() 函数解析

【Python_Pandas】reset_index函数解析 文章目录 【Python_Pandas】reset_index函数解析1. 介绍2. 示例2.1 参数drop2.2 参数inplace2.3 参数level2.4 参数col_level2.5 参数col_fill 参考 1. 介绍 pandas.DataFrame.reset_index reset_index(levelNone, dropFalse, inplaceF…

【AI大模型智慧办公】用《文心一言》1分钟写一篇博客简直yyds

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会,博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来,让更多人了解自己。通过写博客&a…

【Python入门】Python循环语句(while循环的基础语法)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…