系统认知篇:防腐层、门面模式及适配模式的本质

news2025/1/11 15:01:50

门面模式和适配器模式是代码级的设计模式,而防腐层本质是一种 防御型策略 ,在更高的层级对系统进行解耦

1 关于防腐层

Anti-Corruption Layer(ACL) 如下:

Implement a façade or adapter layer between different subsystems that don't share the same semantics . This layer translates requests that one subsystem makes to the other subsystem. Use this pattern to ensure that an application's design is not limited by dependencies on outside subsystems .

不共享语义不同子系统间实现一个门面层或适配层,该层转换一个系统到另一个子系统的请求,使用该模式确保一个应用的设计不被外部系统的依赖所限制。

2 问题背景

一个系统不可能承担所有的职能,大多数情况下都会依赖外部系统的数据或能力。这些外部系统或者遗留系统所关注的领域以及技术选型不尽相同,特别是对于一些老旧的遗留系统往往会面临是技术升级或淘汰的场景。所以,新系统与老系统间的集成往往需要适配他们的协议、数据模型、API或者某些功能特性,但是对于设计人员并不总是希望将这些方面的 “渗入” 到当前系统中。这种情况不仅仅出现在新系统和遗留系统之间,对于系统所依赖的第三方系统也同样适用,因为这些第三方系统可能存在由不同团队开发、技术选型及架构各异、领域模型不一致、可控性差等等诸多不可控因素。

上述场景在实际的业务开发中经常遇到,我们构建的系统并不是孤立的,而是会融入到公司现有的IT系统,甚至会依赖公司外部的三方服务,形式上可能基于HTTP协议的调用,也可能是内部的JSF或OPEN-API调用。这种场景下,外部系统服务提供的模型与内部系统领域上下文下的模型不能确保保持一致。如果在系统设计时不考虑隔离,而是将外部模型直接穿透到内部系统的核心域,则当模型语义产生不一致,或发生变化时,会污染自身领域。

3 解决方案

建立防腐层对不同的子系统进行隔离,该层负责转换两个子系统间的通信。通过引入防腐层,实现不同子系统间的解耦,隔离外部系统的变化对当前系统的影响,避免当前系统的设计由于外部系统的设计和技术实现方式而进行妥协

防腐层一般会包括模型转换的职能:

• 将当前系统的模型转换成外部系统的模型

• 将外部系统的响应转换成当前系统的模型

除此之外,通过在不同子系统间引入独立的 "层",可以在该层进行例如:

• 外部系统调用进行统一监控

• 对多个子系统的门面封装

• 对模型转换的适配

• 外部调用失败的降级处理

• 统一缓存机制

• .....

防腐层模式适用于:

• 如果老系统迁移至新的系统需要多个迁移阶段,但是依然要维护新系统和老系统间的集成

• 两个或更多子系统间存在不同的语义,但是依然需要相互通信

需要说明的是,如果两个系统间没有特别大的语义差异可能不太适合防腐层模式。也就是说,存在与外部系统交互的场景不一定非要使用防腐层模式,对于模型稳定、语义一致的场景,则没有必要引入额外的一层进行隔离。

4 门面模式与适配器模式

4.1 门面模式

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 .

门面模式在当前系统和外部系统之间引入了“薄薄的一层”,实现了客户端与外部复杂子系统或组件的解耦,但其并不是降低了系统的复杂性,相应的,它只是对客户端屏蔽了外部系统的复杂性,使得客户端访问子系统更加简单。

• 门面类的职能并不应该对子系统接口的返回数据模型进行封装,其只是负责简化对子系统接口的访问。

• 门面模式并不是对所有的子系统接口都进行覆盖,按需即可

• 门面类不局限于一个,例如,有多个子系统,可以按实际情况建立多个门面类

• 子系统感知不到门面类的存在,而门面类则需要感知各个子系统

• 门面类和子系统耦合,子系统接口的变更会影响到门面类的变更

4.2 适配器模式

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.

通过适配器模式实现两个不兼容接口的无缝集成:

适配器模式本质上适配器模式所承担的职责应该是 "不多不少",只要满足不兼容接口的适配能力即可。

适配器模式目标类和适配者类解耦,易于扩展,符合SOLID的开闭原则,同时,也提高了对已有类的复用性。但,和其他的设计模式一样,适配器模式也会引入额外的类,在一定程度上也会增加系统的复杂性,同样也会增加对代码的认知负载。

5 结语

门面模式和适配器模式是代码级的设计模式,而防腐层本质是一种防御型策略,在更高的层级对系统进行解耦。通常情况下,防腐层包含一系列的门面类和适配器类以及一些转换器类。

• 门面模式对外部系统接口进行简单封装以便更易使用

• 适配器模式负责进行内部系统与外部系统的模型兼容

• 转换器负责对扩系统的模型进行转换 

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

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

相关文章

用断言更好地实现替换重复出现的单词

断言是指对匹配到的文本位置有要求。也就是说,在有些情况下,我们对要匹配的文本的位置也有一定的要求。为了解决这个问题,正则中提供了一些结构,只用于匹配位置,而不是文本内容本身,这种结构就是断言。常见…

C++_Linux报错问题记录

1、致命错误:vector:没有那个文件或目录 解决:.c文件只会引用C语言的标准库,vecter是属于C的语法,把文件名称改成cpp即可 2、.cpp文件中下面编译语句报错:对‘std::cout’未定义的引用 gcc -o test test.…

docker 报错

问题说明:我是服务器上面的docker拉到本地30卡想用的,但是失败,报错如下: 服务器上面显存驱动是450,本地30卡驱动是470 nvidia-docker run -it --name 20230821_3 --shm-size 16g -p 10029:22 --privileged 20230821_i…

关于cloudflare的“检查站点连接是否安全”一直反复转圈的问题

前一段时间访问不少网站都会出现类似以下的信息: 其中很多时候哦是没有红色框框一栏,就是拼命在转圈和刷新页面,等上一个小时都没用。以上情况看很多网上的说法是卸载浏览器安装的插件。我寻思我也没安装过什么插件。 对于试过网上不少方法但…

java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别

两个对象的hashCode()相同时,equals()相等吗?_两个对象的hashcode一样,equal一样么_不想当个程序员的博客-CSDN博客 equals():比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equal…

Vulnhub: DOUBLE: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.209 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.209 目标80端口 sendcommand.php页面源码 写入webshell <?php system($_GET["cmd"]);?> 执行命令 ht…

不修改原图片,自动添加水印

只要添加我写的一个DynaWatermark2.1.1.jar的包,然后在web.xml里配置一下,哪个文件夹下的图片需要动态水印,就可以啦!以后通过页面访问这个文件夹下的图片,就会自动加上水印.但不会修改文件夹里图片本身.   这个jar里面有添加图片水印和文字水印两个servlet.(不能两个都配置,…

《golang设计模式》第二部分·结构型模式-03-组合模式(Composite)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 将叶子节点和复合节点组合起来&#xff0c;定义一个抽象接口遍历他们 1.1 角色 Component&#xff08;抽象构件&#xff09;&#xff1a;为叶子构件和复合构件声明接口&#xff0c;定义了结构…

Docker安装并运行Alertmanager

Linux下安装Docker请参考&#xff1a;Linux安装Docker 简介 Alertmanager是一个独立的告警模块&#xff0c;接收Prometheus等客户端发来的警报&#xff0c;之后通过分组、删除重复等处理&#xff0c;并将它们通过路由发送给正确的接收器&#xff1b;告警方式可以按照不同的规…

openCV实战-系列教程2:阈值与平滑处理(图像阈值/图像平滑处理/高斯/中值滤波)、源码解读

1、图像阈值 t图像阈值函数&#xff0c;就是需要判断一下像素值大于一个数应该怎么处理&#xff0c;小于一个数应该怎么处理 ret, dst cv2.threshold(src, thresh, maxval, type) 参数解析&#xff1a; src&#xff1a; 原始输入图&#xff0c;只能输入单通道图像&#…

/root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘+ssh-rsa‘.

文章目录 1、问题2、查看openssh版本3、解决问题4、重新生成密钥5、查看是否可连接工蜂 1、问题 ssh访问工蜂报错&#xff1a; [rootlocalhost .ssh]# ssh -T gitgit.code.tencent.com /root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘ssh-rsa’. 2、查看o…

如何识别芯片引脚1

当从上面看芯片时&#xff0c;引脚总是按逆时针方向编号。这来自于旧时代的电子管&#xff0c;当从电子管的底部看时&#xff0c;引脚是按顺时针方向编号的。 芯片的标记方式有多种&#xff0c;但是总有一些惯例可循。换句话说&#xff0c;如果你在一个未知的芯片上发现了这些标…

Linux的基础编程——Linux常用操作总结(十一)

前言&#xff1a; 前面我们已经对在Linux系统上的一些常用操作已经有了一个简单的入门与了解&#xff0c;后面的学习中我们还需要对这些操作常加练习&#xff0c;现在让我们对之前的一些常用操作进行的一个简单的总结吧 目录 一、软件安装 CentOS系统使用&#xff1a; Ubun…

pdf转换成excel怎么转换?看看这几种方法

pdf转换成excel怎么转换&#xff1f;转换PDF文件到Excel是一个常见的需求&#xff0c;因为许多工作需要将PDF文件转换成可编辑和可搜索的Excel电子表格。无论是在学校、办公室还是在家里&#xff0c;将PDF文件转换成Excel文件的需求都屡见不鲜。有时候&#xff0c;你可能需要将…

江苏211+双一流学校,专业课比408难度低,来看看23考情吧

南京师范大学 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文预计813字&#xff0c;预计阅读&#xff1a;2分钟。 2023考情概况 南…

(五)Docker 安装 redis镜像+启动redis容器(超详细)

输入&#xff1a;su root命令&#xff0c;切换到root 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行状态&#xff08;显示绿色代表正常启动&#xff09;&#x…

配置真实项目问题1--拉取项目并搭建环境

一、下载nvm安装管理node版本 1.安装nvm之前一定要把电脑中原有的node版本给卸载干净&#xff1b; 2.nvm下载链接&#xff1a;nvm.uihtm.com/ 3.具体安装流程可以参考https://zhuanlan.zhihu.com/p/550264306这篇文档 4.安装之后&#xff0c;在控制台中查看版本node -v,发现依旧…

长胜证券:新三板转板条件?

跟着时间的推移和环境的变化&#xff0c;商场对解决中小企业融资难的需求日益增加&#xff0c;新三板作为商场化的多层次资本商场&#xff0c;为小微企业融资供给了重要途径。但是&#xff0c;跟着新三板商场的逐步老练&#xff0c;越来越多的企业希望通过转板进入更为活泼的A股…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工…

张少光:快递件量显韧性 价格仍承压

张少光指出&#xff0c;今年以来居民消费需求偏弱&#xff0c;快递件量增速表现稳健耐性&#xff0c;但价格在职业竞赛下出现下滑走势。咱们以为当时职业进入存量博弈期&#xff0c;价格下行压力或继续&#xff0c;件量增速出现放缓趋势&#xff0c;咱们主张优选具备α的龙头快…