开闭架构

news2024/11/20 18:39:06

在《不过时的经典层架构》里,有朋友留言关于Manager和Engine的概念,虽然朋友留言把概念解释清楚了。为了避免其他人有同样的疑问,这里我还是再解释一下。

92443dbef757e5565463f9d2c5a6e605.png

以上是经典的四层架构,在这个架构中,Manager和Engine(引擎)都是业务逻辑层的概念。Manager中文就是管理者,就是把行为管理起来。Engine是行为本身。咱们超出业务逻辑层,针对这个概念本身来看,什么是引擎行为呢?咱们很多朋友听说过搜索引擎、计算引擎吧。为什么搜索引擎称之为引擎呢?因为它一般不是独立使用的,一般是嵌入到网站上,作为网站上的一个行为,这个行为是对信息进行组织处理后,为用户提供检索服务,并将相关信息展示给用户。这个行为最重要的特点是整套一起使用。如果整套都是一起使用,易变性低,可以作为基础操作,这就可以称之引擎。Manager管理者这个角色与Engine引擎最大的不同就是易变性上,它组织了一个或者多个行为,如果这些行为都是一起使用,序列也不变,那也可以叫一个引擎。就像搜索引擎里综合信息处理,提供检索服务一样。但是序列,也就是行为的组织方式易变,那就需要一个管理者来组织。下面会有例子说明为什么一定要清楚这个。

下面来说一下今天的正题,开闭架构。

开放架构

在开放架构中,无论组件在哪一层,都可以随意进行调用。这些调用关系包含向上层调用,向下层调用,平行调用。开放架构提供了无止境的灵活性,但是牺牲了封装性,引入了耦合。

比如向上层调用:在四层架构中,业务层调用客户端。一旦UI变了,业务层就也得跟着变了。

但是实际中,那么傻的事情是很少发生的。但是,实际上有时候我们非常想,我暴露一个对外接口,这个接口作用就是调用一下数据库做个处理。我何苦这么麻烦,先封装一个XXManager,XXManager调用XXEngine,XXEngine还要调用XXAccess。其实这些里面只是直接调用了下一层,其他什么也没有做,直接调用数据库多省事啊。这里面就涉及到易变性封装的问题,客户端需求变了,要动很底层。

所以,当然,开放架构是目前不推荐的架构形式。

封闭架构

在封闭架构中,不允许向上层调用和同级调用,只允许向下调用。这样就牺牲了灵活性,但是封装了易变性,同时促进解耦。也是一般比较推荐的架构。

但在咱们实际的项目中,会有一些同级调用的冲动。就是这种冲动会让代码很难维护。比如有段逻辑A,是Manager层的。另外来了一个需求B,正好可以复用这部分代码,同时增加一些其他逻辑。那本着代码复用,减少重复代码的原则,我应该直接调用A啊。为了不打乱层级,我把这段公共代码抽到下一层Engine层。那这段逻辑也要调用Engine层啊,不又是同级调用了吗?按照我的经验,一般这种情况是习惯于Engine层很薄导致的,概念解释说了引擎可以是一个大组件。可以检查一下Engine同级调用的地方是不是可以直接调用Access不会引起很多重复代码。如果不行,那说明咱们的业务逻辑过于复杂,四层不够,架构设计少了一层。

半开半闭架构

在半开半闭架构中,允许向下多层调用。我记得十几年前,我特别喜欢写数据库存储过程,代码端可干净了。因为逻辑全在数据库那里,这个时候开放架构是很合适的,因为一旦有改动,核心改动点在存储过程,上面都要跟着变,当然上层越少越好了。但是现在大型项目都不推荐使用存储过程了,最重要的一点就是易变性。

这种调用也是封装性和灵活性的妥协,也是要避免的。

封闭架构中规则的放松

封闭架构过于严格,有些代码编写就会殊为不易。所以它有两个明确的放松规则的例外:

调用工具

像日志和监控埋点等工具,其他层均可调用。

弱引用

比如在两个Manager之间使用了队列作为调用方式,因为是弱引用,是允许同级调用的。

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

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

相关文章

【liunx配置服务自启动】liunx系统设置net Core程序开机自启动服务 centos系统

liunx系统设置net Core程序开机自启动服务 系统版本:Centos7.9 我的程序部署到/www/wwwroot/AcmeBookStoreHttpApiHost.com/目录下, 程序名是Meowv.Blog.HttpApi.Hosting.dll 1.新建自启动配置文件 首先跳转到system目录下 cd /usr/lib/systemd/syste…

【.net core】yisha框架,实体不在同一项目下设置swagger接口及实体模型注释,授权鉴权

1.Startup.cs中ConfigureServices方法中添加: 授权鉴权内容 #region 授权鉴权//Bearer 的scheme定义var securityScheme new OpenApiSecurityScheme(){Description "使用JWT方案授权,请求时,在请求头部信息中加入: \"Authoriza…

分布式计算模型详解:MapReduce、数据流、P2P、RPC、Agent

前言 本文隶属于专栏《大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据理论体系 思维导图 MapReduce MapReduce 是一种分布式计算模…

Tomcat与Undertow容器性能对比分析

👨‍🎓作者:bug菌 ✏️博客: CSDN、 掘金、 infoQ、 51CTO等 🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉,对…

BufferedImage将图片切成圆形

原图 修改后 方法一 //文件路径 File imageFile new File(path); public BufferedImage changeImages(File imageFile) {BufferedImage avatarImage null;try {avatarImage ImageIO.read(imageFile); avatarImage scaleByPercentage(avatarImage, avatarImage.getWidth(…

LENOVO联想笔记本电脑ThinkBook 15 G2-ITL(20VE)原装出厂Windows10系统恢复原厂OEM设置预装系统

Lenovo联想笔记本电脑,ThinkBook 15 G2-ITL(20VE)出厂Windows10系统,出厂预装系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式:ISO 文件大小&#xf…

最优化--凸函数--拉格朗日乘子法

目录 凸函数 凸函数定义 凸函数的判定 性质特点 拉格朗日乘子法 基本思想 有约束最优化问题 拉格朗日乘子法 凸函数 凸函数(Convex Function)是定义在凸集上的实值函数,具有以下性质:对于任意两个定义域内的点&#xf…

Windows11系统启动VMware Workstation 在此主机上不支持嵌套虚拟化导致无法启动虚拟机

问题复现: VMware Workstation中的虚拟机时启动失败,弹出错误弹窗: VMware Workstation 在此主机上不支持嵌套虚拟化。 模块“MonitorMode”启动失败。 未能启动虚拟机。 问题原因: 不要同时开启hyper-V和VMware虚拟机软件&…

(小程序)指定问题换一批功能实现

(小程序)指定问题换一批功能实现 vue3写法 html <view class"title"><p>推荐问题</p><view class"refresh" click"onRefresh"><text>换一批</text><image src"https://cdn.tudb.work/aios/web/im…

MongoDB的数据类型

BSON JSON作为一种轻量级的数据交换格式&#xff0c;JSON的可读性非常好&#xff0c;而且非常便于系统生成和解析&#xff0c;这些优势也让它逐渐取代了XML标准在Web领域的地位&#xff0c;当今许多流行的Web应用开发框架&#xff0c;如SpringBoot都选择了JSON作为默认的数据编…

007+limou+C语言基础排序算法(上)

0.前言 您好这里是limou3434的一篇博文&#xff0c;感兴趣可以看看我的其他内容。 排序算法简单理解就是&#xff1a;一串数组经过排序算法后得到有序的数组。排序算法在不同应用场景有不同的效果&#xff0c;因此我们有必要了解一些基础的排序算法。 而本次我给您带来的是一…

vue+leaflet实现聚合图(根据半径划分)

效果 官方示例 github地址 1. 安装leaflet.markercluster插件 npm install leaflet.markercluster -S** 2. 在项目中引入leaflet.markercluster和样式文件 ** import leaflet.markercluster/dist/MarkerCluster.css import leaflet.markercluster/dist/MarkerCluster.Def…

SqlServer定时执行存储过程

1.连接数据库后选择【SQL Server 代理】—【作业】——右键【新建作业】&#xff0c;具体操作如下图&#xff1a; 2.【新建作业】步骤如下图所示&#xff1a; 3.新建【步骤】&#xff0c;具体如下图所示&#xff1a; 4.新建【计划】&#xff0c;具体如下图所示&#xff1a; 6.配…

Ubuntu 20.04 下g++用不了,但是提示已经安装

问题描述 用sudo apt-get install g来安装&#xff0c;系统却又说g已经是最新版本了&#xff0c;但是用g -v查看又提示需要安装 g&#xff0c;如图片所示。 解决方法 未安装g&#xff0c;安装依赖只需运行命令行&#xff1a; sudo apt-get install build-essential仍然无法成…

docker部署redis

一、拉取镜像 docker search redis 我部署的是redis6.0&#xff0c;使用docker pull 拉取镜像 docker pull redis:6.0 拉取成功后使用docker image查看镜像 docker images | grep redis 二、创建挂载目录 在 /opt 目录下创建redis的 conf 和 data 目录 sudo mkdir /opt/re…

YOLOv5 环境安装

Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09; Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09;_wnowswolf的博客-CSDN博客 安装 Anaconda3 可以改为miniconda 占用更小 将安装目录下的Scripts和condabin文件夹的路径加入环境变…

linux重启网卡失败

[TO简单粗暴啊&#xff1a; RTNETLINK answers: File exists 这个报错&#xff0c;我看了一下网卡目录下出现了两个网卡配置文件&#xff0c;一个ens33&#xff0c;一个eth0。我本机是ens33&#xff0c;所以把eth0的删除了&#xff0c;就可以了。我这个是测试机器&#xff0c;…

人脸识别是什么?及人脸识别的流程

目录 1. 人脸识别是什么及应用场景2. 人脸识别的组成2.1 前端图像采集2.2 后端智能平台 3.人脸技术的流程3.1人脸检测3.2人脸对齐3.2.1仿射变换3.2.2对齐方法 3.3人脸编码&#xff08;提取特征向量&#xff09;3.4人脸分类 1. 人脸识别是什么及应用场景 人脸识别特指利用分析比…

什么是 frp内网穿透?快解析内网穿透如何实现远程办公?

1.什么是frp内网穿透 frp是一个开源、简洁易用、高性能的内网穿透和 反向代理软件&#xff0c;支持 tcp, udp, http, https等协议&#xff0c;虽然它体积轻量但功能很强大。它利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服务&#xff1b;对于 htt…

python项目在linux中的启动脚本(shell脚本)

背景&#xff1a; 在linux环境&#xff0c;使用shell脚本&#xff0c;实现对某个服务的启动、停止功能。 shell脚本的功能&#xff1a; 启动&#xff08;start&#xff09;&#xff1a;通过参数 start &#xff0c;实现启动服务。如果该服务已经启动&#xff0c;给出已经启动…