23种设计模式(10)——门面模式
门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。
其实,在日常编码工作中,我们都在有意无意地大量使用门面模式。但凡只要高层模块需要调度多个子系统(2个以上类对象),我们都会自觉地创建一个新类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。
来个简单的demo:
我u有以下三个service:
public class ServiceA { public void doA(){ System.out.println("do ServiceA"); }
}
public class ServiceB { public void doB(){ System.out.println("do ServiceB"); }
} public class ServiceC { public void doC(){ System.out.println("do ServiceC"); }
}
在没有引入门面模式的时候,我们是这么调用的:
public class Client { public static void main(String[] args) { ServiceA serviceA = new ServiceA(); ServiceB serviceB = new ServiceB(); ServiceC serviceC = new ServiceC(); serviceA.doA(); serviceB.doB(); serviceC.doC(); }
}
没啥毛病啊,结合到spingmvc开发,这些service交给spring管理,根本不用自己new了,直接注入到controller就可以,但是如果10个地方都用了这三个service呢?这10个controller里都注入一下?这时候考虑优化——我可以新建一个service,持有这个三个service不就ok了吗:
public class ServiceFacade { //是不是很像我们controller里注入各种service? private ServiceA serviceA = new ServiceA(); private ServiceB serviceB = new ServiceB(); private ServiceC serviceC = new ServiceC(); public void doA() { serviceA.doA(); } public void doB() { serviceB.doB(); } public void doC() { serviceC.doC(); }
}
客户端就变成了
public class Client { public static void main(String[] args) { //轻轻松松的搞定,只需要创建门面这个对象即可 ServiceFacade serviceFacade= new ServiceFacade (); serviceFacade.doA(); serviceFacade.doB(); serviceFacade.doC(); }
}
门面模式中的角色
由上图可以看到,门面模式主要包含2个角色。
- 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
- 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即Facade对ServiceA、ServiceB、ServiceC透明)。
门面模式的扩展
优点
● 减少系统的相互依赖 想想看,如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。
● 提高了灵活性 依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。
● 提高安全性 想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。
缺点
当增加子系统和扩展子系统行为时,可能容易带来未知风险。
不符合开闭原则。
某些情况下,可能违背单一职责原则。
相关文章:
23种设计模式(10)——门面模式
门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。 其实,在日常编码工作中,我们都在有…...
磨人的Ts
const visibleData reactive<{ [key: number]: boolean }>({});这啥意思 这段代码的意思是创建了一个响应式对象visibleData,它是一个包含键为数字、值为布尔值的对象。 reactive函数是Vue 3 Composition API中的一个函数,它可以将一个普通对象…...
一个基于Excel模板快速生成Excel文档的小工具
介绍 DocumentGenerator是一个Excel快速生成工具,目标以后还能实现Word、pdf等的文件的生成。该程序独立运行,可通过HTTP接口调用其生成接口。 典型使用场景为如下: 使用者编写模板文件使用者准备模板文件的填充JSON数据内容使用者通过网络…...
服务器动态/静态/住宅/原生IP都是什么意思
在互联网的世界中,我们经常会听到关于IP地址的各种说法,比如服务器动态IP、静态IP、住宅IP和原生IP。那么这些术语究竟代表着什么意思呢?让我们一起来了解一下。 动态IP 动态IP(Dynamic IP)是指互联网服务提供商(ISP)在每次用户上网时,…...
缓解大模型幻觉问题的解决方案
本文记录大模型幻觉问题的相关内容。 参考:Mitigating LLM Hallucinations: a multifaceted approach 地址:https://amatriain.net/blog/hallucinations (图:解决大模型幻觉的不同方式) 什么是幻觉? 幻觉…...
Python装饰器进阶:深入理解与最佳实践
1、什么是装饰器 https://docs.python.org/zh-cn/3.7/glossary.html#term-decorator 官网介绍的很简单,返回值为另一个函数的函数,通常使用 wrapper 语法形式来进行函数变换。装饰器就是闭包的应用,是用来**装饰(修改或增强&…...
数据库数据恢复—Oracle数据库报错ORA-01110错误的数据恢复案例
Oracle数据库故障: 北京某公司一台运行oracle数据库的服务器,机房意外断电导致该服务器重启,重启后发现oracle数据库报错。该Oracle数据库没有备份。 Oracle数据库数据恢复过程: 1、北亚企安数据恢复工程师检查该oracle数据库的数…...
如何通过adb控制安卓手机wifi
一、准备工作 1、先用USB数据线 将手机和电脑连接在一起 1) 数据线连接手机和电脑,选择“传输文件”的连接方式; 2) 在手机上,打开“开发者选项”、“USB调试”; 2、在电脑上安装adb工具,参考…...
VR全景应用广泛体现在哪里?有何优势?
VR全景作为一种新型营销方式,正在逐渐走进人们的视线,它区别于以往单一角度的照片和视频,VR全景制作显得更加直观、更加真实、更加生动。VR全景通过VR技术将所拍摄的图片变成720度可观看的场景模式,把产品的特色以及魅力整体呈现展…...
【深度学习】Python使用指定gpu运行代码
命令行指定显卡GPU运行python脚本 在大型机构分配的服务器集群中,需要使用GPU的程序默认都会在第一张卡上进行,如果第一张卡倍别人占用或者显存不够的情况下,程序就会报错说没有显存容量,所以能够合理地利用GPU资源能帮助你更快更…...
二叉树的遍历
树森林二叉树先序遍历先序遍历先序遍历后序遍历中序遍历中序遍历 1.前序遍历 leetcode题目链接 1.1 递归 前序遍历递归方式 class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;if(root){res.push_back(root->val);ve…...
分布式限流:Redis
目录 1:如何实现分布式限流 2:限流的几种类别 2.1:固定窗口限流 2.2:滑动窗口限流 2.3:漏桶限流 2.4:令牌桶限流 3:实现分布式限流:Redis 3.1:引入Redisson的依赖包 3.2:初始化Redisson 3.3:创建Redisson的限流类 1:如何实现分布式限流 1:把统计用户的使用频率等这些…...
python excel接口自动化测试框架
前言 前些天写了pytestyamlallure接口自动化测试框架这篇文章。 今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法,…...
Java开发面试--MongoDB专区
1、你是否了解 MongoDB? 答: 是的,我了解 MongoDB。MongoDB是一个流行的NoSQL数据库,它以文档的形式存储数据,具有高度的灵活性和可扩展性。我熟悉MongoDB的基本概念和特性,例如集合(Collectio…...
当『后设学习』碰上『工程学思维』
只要我成为一个废物,就没人能够利用我! 雷猴啊,我是一只临期程序猿。打过几年工,写过几行代码。但今天我不想聊代码,我们聊聊学习这件事。 技术年年更新,尤其是前端框架,很多时候觉得学习速度都…...
一表谈现实、系统、流程、报表与BI
序号主题描述1系统与现实1.1管理系统个体应用决定因素管理能力、软件工程与管理环境的综合结果1.2信息系统与现实业务的关系现实世界是以业务利弊为抓手;信息系统是以业务流程为抓手;信息系统只是对现实业务部分的数字化应用总结:现实业务是以…...
数据结构顺序栈例题一
内容仅供个人复习 #include<iostream> #define MAXSIZE 100using namespace std;typedef struct {int *base;int *top;int stackSize;}SqStack;void Initstack( SqStack &s) // 初始化栈 {s.base new int[MAXSIZE];s.top s.base;s.stackSize MAXSIZE; }void Pus…...
大模型在百度智能问答、搜索中的应用
本文主要介绍了智能问答技术在百度搜索中的应用。包括机器问答的发展历程、生成式问答、百度搜索智能问答应用。欢迎大家加入百度搜索团队,共同探索智能问答技术的发展方向,文末有简历投递方式。 01 什么是机器问答 机器问答,就是让计算机…...
ARPG----C++学习记录01日志和调试
多人射击有点难,发现这个更加基础,先学习这个 显示日志 可以在代码中插入这样一行来打印日志,蓝图里的printstring会在屏幕和日志里都显示。可以使用%f,d等来获取后边的输入值。对于打映字符串变量,传入需要* UE_LOG…...
3302. 表达式求值, 栈的应用
3302. 表达式求值 - AcWing题库 给定一个表达式,其中运算符仅包含 ,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。 注意: 数据保证给定的表达式合法。题目保证符号 - 只作为减号出现&…...
如何选择最佳视频播放器?Awesome Video推荐15款跨平台解决方案
如何选择最佳视频播放器?Awesome Video推荐15款跨平台解决方案 【免费下载链接】awesome-video A curated list of awesome streaming video tools, frameworks, libraries, and learning resources. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-video …...
鸿蒙备考题库页面构建:错题本、小组榜单与备考提示模块详解
鸿蒙备考题库页面构建:错题本、小组榜单与备考提示模块详解 前言 在 HarmonyOS 6.0 应用开发中,教育类应用的错题管理、学习排行榜和系统提示是提升用户粘性的关键功能模块。本文将以“备考题库”应用中的“错题本”高频错题列表、“小组榜单”学习排名和…...
Win11Debloat:3分钟彻底清理Windows 11臃肿系统,恢复纯净体验
Win11Debloat:3分钟彻底清理Windows 11臃肿系统,恢复纯净体验 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes t…...
数据鲸鱼具身智能task3
我的理解:模型广场提供了模型的雏形与底座,是一些已经85分的通用模型,各任务可以基于这里的模型去试验,根据试验的结果(这里就到了数据管理)发现数据的偏向或侧重点不同,根据这种数据的表现差异…...
远程办公远控软件怎么选?ToDesk、向日葵、UU远程深度对比
远程办公远控软件怎么选?ToDesk、向日葵、UU远程深度对比远程办公这件事,现在很多人已经习惯了。但很多人忽略了一个问题——远程办公体验好不好,很大程度上取决于你用的远控软件怎么样。我之前帮公司选远控工具的时候,认真把市面…...
JMeter断言实战:从误配到分层校验的避坑指南
1. 为什么断言不是“加个检查框”就完事了?很多人第一次在 JMeter 里点开“添加 → 断言 → 响应断言”,填上“包含文本:success”,跑完看绿色小勾就以为接口测试闭环了。我带过三届测试团队,新同事交来的脚本里&#…...
Redis分布式锁进阶第一十一篇
一、本篇前置衔接 第一十一篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实复杂业务永远不是单一资源:下单要扣库存、扣优惠券、扣积分、冻结余额,多资源并行争…...
ElevenLabs荷兰文语音生成速度对比实测:从4.2s→0.8s的WebSocket流式优化路径(附可复用代码片段)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs荷兰文语音生成速度对比实测:从4.2s→0.8s的WebSocket流式优化路径(附可复用代码片段) ElevenLabs 的 Dutch(nl-NL)语音合成在默认…...
minecraft-ondemand故障排查指南:解决AWS无服务器我的世界服务器常见问题
minecraft-ondemand故障排查指南:解决AWS无服务器我的世界服务器常见问题 【免费下载链接】minecraft-ondemand Templates to deploy a serverless Minecraft Server on demand in AWS 项目地址: https://gitcode.com/gh_mirrors/mi/minecraft-ondemand mine…...
HS2汉化补丁终极指南:轻松实现Honey Select 2中文界面
HS2汉化补丁终极指南:轻松实现Honey Select 2中文界面 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面而困扰吗&…...
