设计模式—门面模式

news2024/10/7 16:19:26

定义:

门面模式,也称为外观模式,是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口,从而简化客户端与复杂子系统之间的交互。

在门面模式中,一个门面类充当中介,为客户端提供一个简化了的访问方式,而不需要了解子系统的具体细节。这样不仅降低了客户端与子系统之间的耦合度,还使得子系统的使用更加方便

本章代码:小麻雀icknn/设计模式练习 - Gitee.com

UML类图:

 

门面模式的构成:

 在门面模式中,通常存在两个角色:

  • 外观角色(Faced):与客户端交互的类,封装了子系统的交互逻辑,对外提供统一的访问入口。
  • 子系统(SubSystem):子系统是一个广义的概念,可以是一个类、一个功能模块或者是一个完整的子系统。子系统能够实现具体的功能。

 例子:

外观角色(faced):

package com.study.main.Faced;

public class Faced {
    public SubA subA =new SubA();
    public SubB subB = new SubB();
   void doAB(){
       subA.doSomething();
       subB.doSomething();
   }
}

子系统A

package com.study.main.Faced;

public class Faced {
    public SubA subA =new SubA();
    public SubB subB = new SubB();
   void doAB(){
       subA.doSomething();
       subB.doSomething();
   }
}

子系统B

package com.study.main.Faced;

public class SubB {
    void doSomething(){
        System.out.println("B do Something");
    }
}

测试&运行

package com.study.main.Faced;

public class Main {
    public static void main(String[] args) {
        new Faced().doAB();
    }
}

门面模式在源码中的应用 :

在tomcat 中大量的使用了门面模式

Tomcat 中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。在Tomcat源码中搜索Facade(门面):

其中拿ReguestFacade.class来说,它是HttpSeryletRequest外观类,里面封装了各种操作request的常见方法,比如getParameter方法等。
Reguest.class中封装了 HttpRequest 接口能够提供的数据,是子系统的门面。实际项目中对request进行操作的时候,其实使用的都是ReguestFacade这个外观类对象:

使用场景分析 :

一般来讲,门面模式常用的使用场景有以下几种。

  • 简化复杂系统。 比如,当我们开发了一整套的电商系统后(包括订单、商品、支付、会。员等系统),我们不能让用户依次使用这些系统后才能完成商品的购买,而是需要一个门户网站或手机 APR 这样简化过的门面系统来提供在线的购物功能。
  • 减少客户端处理的系统数量。比如,在 Web 应用中,系统与系统之间的调用可能需要处理 Database 数据库、Model 业务对象等,其中使用 Database 对象就需要处理打开数据库、关闭连接等操作,然后转换为 Model业务对象,:实在是太麻烦了。如果能够创建一个数据库使用的门面(其实就是常说的 DAO 层),那么实现以上过程将变得容易很含
  • 让一个系统(或对象)为多个系统(或对象)工作。比如,线程池ThreadPool就是一个门面模式,它为系统提供了统一的线程对象的创建、销毁、使用等。
  • 当我们的电商系统中需要一些新功能时,比如,人脸联合更多的系统来扩展原有系统。识别,我们可以不需要自行研发,而是购买别家公司的系统来提供服务,这时通过门面系统就能方便快速地进行扩展。
  • 作为一个简洁的中间层。门面模式还可以用来隐藏或者封装系统中的分层结构,同时作为一个简化的中间层来使用。比如,在秒杀、库存、钱包等场景中,我们需要共享有状态的数据时(如商品库存、账户里的钱),在不改变原有系统的前提下,通过一个中间的共享层(如将秒杀活动的商品库存总数统一放在 Redis里),就能统一进行各种服务(如,秒杀详情页、商品详情页、购物车等)的调用。

门面模式优缺点:

优点:

  • 简化接口:门面模式提供了一个简单的接口来访问子系统,从而减少了客户端与子系统之间的复杂性。
  • 解耦系统:门面模式将客户端与子系统解耦,从而使得子系统的修改不会影响到客户端。
  • 提高安全性:门面模式可以限制客户端对子系统的直接访问,从而提高了安全性。
  • 提高可维护性:门面模式将系统的复杂性隐藏在门面后面,从而使得系统更容易维护和修改。

缺点:

  • 过度使用门面模式可能会导致代码变得复杂和难以维护。
  • 门面模式可能会使代码过度耦合,因为所有客户端代码都需要通过门面进行访问。
  • 门面模式可能会导致性能问题,因为每次调用门面都需要执行一些额外的代码来处理请求。
  • 如果门面过于复杂,可能会导致代码重复和冗余。门面模式可能会限制系统的扩展性,因为所有客户端代码都需要通过门面进行访问,而不能直接访问底层组件

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

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

相关文章

B203-若依框架应用

目录 简介版本RuoYi-fast项目准备新增模块/代码生成 简介 基于SpringBoot的权限管理系统,基于SpringBoot开发的轻量级Java快速开发框架 版本 前后端未分离单应用版本:RuoYi-fast,前后端未分离多模块版本:RuoYi 前后端分离单应用…

Adobe AE(After Effects)2020下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件,由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能,可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

逻辑回归模型-逻辑回归算法原理-逻辑回归代码与实现-笔记整合

通过一段时间的学习,总算把逻辑回归模型弄清楚了 《老饼讲解-机器学习》www.bbbdata.com中是讲得最清晰的,结合其它资料,整理一个完整的笔记如下,希望能帮助像我这样入门的新人,快速理解逻辑回归算法原理和逻辑回归实…

代码随想录训练营Day 24|Python|Leetcode|93.复原IP地址, 78.子集,90.子集II

93.复原IP地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 &q…

git clone遇到报错“SSL certificate problem: self signed certificate”

在git clone的时候发现遇到了一个问题: cristDESKTOP-JKRNKSH MINGW64 ~/Desktop $ git clone -b dev https://xxx.xxx.xxx.xxx:3001/crist/AVM_V9M.git Cloning into AVM_V9M... fatal: unable to access https://xxx.xxx.xxx.xxx3001/crist/AVM_V9M.git/: SSL ce…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

自己的事情自己做:使用 Python Turtle 绘制 Python Logo

以下代码中,将向你展示一个有趣的程序,如何使用 Python Turtle 中绘制 Python Logo。Python 翻译成汉语是蟒蛇的意思,Python 的 Logo 也是两条缠绕在一起的蟒蛇。 import turtlepen turtle.Turtle() turtle.bgcolor("black") pe…

Spring基础篇-快速面试笔记(速成版)

文章目录 1. Spring概述2. 控制反转(IoC)2.1 Spring声明Bean对象的方式2.2 Spring的Bean容器:BeanFactory2.3 Spring的Bean生命周期2.4 Spring的Bean的注入方式 3. Spring的事件监听器(Event Listener)3.1 Spring内置事…

开源项目|使用go语言搭建高效的环信 IM Rest接口(附源码)

项目背景 环信 Server SDK 是对环信 IM REST API 的封装, 可以节省服务器端开发者对接环信 API 的时间,只需要配置自己的 App Key 相关信息即可使用。 环信目前提供java和PHP版本的Server SDK,此项目使用go语言对环信 IM REST API 进行封装…

stm32实现hid鼠标

启动CubelMX 选择芯片(直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程(后记:此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文,以及…

facenet人脸检测+人脸识别+性别识别+表情识别+年龄识别的C++部署

文章目录 一. 人脸检测二.人脸识别facenet2.1 训练人脸识别模型2.2 导出ONNX2.3 测试 三.人脸属性(性别、年龄、表情、是否戴口罩)3.1 训练3.2 导出ONNX3.3 测试 四. 集成应用五、Jetson 部署5.1 NX5.2 NANO 一. 人脸检测 代码位置:1.detect …

Java代码执行顺序

Java代码的执行顺序 后面大量的涉及到了static,我曾经写过一篇static的博客,可以看一眼 我上次写了static的加载顺序,没看过的可以进去看一眼 JavaSE:static关键字详解 ---------------------分割线-------------------------…

✌粤嵌—2024/4/3—合并K个升序链表

代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言: 最近在完成公司的项目时,为了兼容其他的版本,需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包,安装成功之后,分享如下: 安装命令: ant-design-vue: 不…

[移动通讯]【无线感知-P1】[从菲涅尔区模型到CSI模型-2]

前言: 前面我们学习了: 1 只 基于机器学习做无线感知问题:泛化性能差,可解释性差 无法解释为什么能做好,什么时候能做好,什么时候做不好. 可行性 到 可用性,泛化性问题,具体深入的研究。 2 无线感知的理论…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错,跑不起来,类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的,然后项目需要node20的,执行下面的就可以正…

【面试八股总结】排序算法(二)

参考资料 :阿秀 一、堆排序 堆排序基本思想是先把数组构造成一个大顶堆(父亲节点大于其子节点),然后把堆顶(数组最大值,数组第一个元素)和数组最后一个元素交换,这样就把最大值放到了数组最后边。把数组长度n-1,再进行构造堆把剩…

HackMyVM-Connection

目录 信息收集 arp nmap WEB web信息收集 dirsearch smbclient put shell 提权 系统信息收集 suid gdb提权 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.115 S…

【PostgreSQL里insert on conflict do操作时的冲突报错分析】

最近在巡检PostgreSQL的数据库的时候,发现部分数据库里存在大量的如下报错 ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained val…

LRTimelapse for Mac:专业延时摄影视频制作利器

LRTimelapse for Mac是一款专为Mac用户设计的延时摄影视频制作软件,它以其出色的性能和丰富的功能,成为摄影爱好者和专业摄影师的得力助手。 LRTimelapse for Mac v6.5.4中文激活版下载 这款软件提供了直观易用的界面,用户可以轻松上手&#…