常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD
三层架构(View Service Dao)
-
三层架构是指:视图层 view(表现层),服务层 service(业务逻辑层),持久层 Dao(数据访问层)
-
表现层:直接跟前端打交互(一是接收前端 ajax 请求,二是返回 json 数据给前端)
-
业务逻辑层:一是处理表现层转发过来的前端请求(也就是具体业务),二是将从持久层获取的数据返回到表现层。
-
数据访问层:负责数据库的访问(可以访问数据库、二进制文件、文本文件等),是对数据库,而不是对数据的操作。
直接操作数据库完成 CRUD,并将获得的数据返回到上一层(也就是业务逻辑层)。
-
-
三层架构的出现是为了降低耦合度。
使用面向抽象编程,也就是上层对下层的调用,直接通过接口来完成,而下层对上层的真正服务提供者,是下层实现的接口实现类。实现类是可以更换的,这就实现了层间的解耦合。
-
实际项目中的包命名结构,其实就是三层架构的体现:
MVC(Model View Controller)
-
MVC 是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的设计方法,它把软件系统分为三个基本部分:**模型(model)、视图(view)、控制器(controller)**
-
MVC 架构提供了一种结构化的方法来开发软件,特别是 Web 应用程序,通过将业务逻辑、用户界面和用户输入分离开来,以提高代码的可重用性、可维护性和可扩展性。
-
MVC 框架的核心组件:
-
模型(Model):负责管理数据和业务逻辑,通常包括数据的存取和业务规则的处理。模型与视图和控制器分离,确保数据的完整性和一致性。
model 一般分为以下两类:
- 数据承载 bean:是指专门承载业务数据的实体类,比如 Student,User 等。
- 业务承载 bean:是指进行业务处理的 Service 或者 Dao 对象,专门处理用户的请求。
-
视图(View):负责展示数据给用户,通常是通过用户界面呈现。视图从模型中获取数据,但不处理数据。
-
控制器(Controller):负责处理用户的输入,控制程序的流程。控制器接收用户的请求,调用模型获取数据,然后选择合适的视图来展示数据。
-
-
MVC 框架的优势:
- 高内聚低耦合:MVC 框架通过将应用程序分为三个独立的部分,减少了各部分之间的依赖,提高了代码的模块化和重用性。
- 易于维护:由于各个部分职责明确,当需要修改功能时,只需关注相关的部分,不会影响到其他部分。
- 可扩展性:当需要添加新的功能时,可以很容易地在现有架构上添加新的模型、视图或控制器,而不需要重写整个应用程序。
SSM(Spring SpringMVC MyBatis)
-
SSM:即 Spring 、SpringMVC、与 MyBatis 三个框架。
-
它们在三层架构中所处的位置是不同的,即它们在三层架构中的功能各不相同,各司其职。
-
Spring:以整个应用大管家的身份出现。整个应用中所有 Bean 的生命周期行为,均由 Spring 来管理。
即整个应用中所有对象的创建、初始化、销毁,及对象间关联关系的维护,均由 Spring 进行管理。
-
SpringMVC:作为 Controller 层的实现者,完成用户的请求接收功能。
SpringMVC 的 Controller 作为整个应用的控制器,完成用户请求的转发及对用户的响应。Spring MVC 是主流的 Web 框架。
-
MyBatis:作为 Dao 层的实现者,完成对数据库的增、删、改、查功能
-
EDD(Event Driven Design)
-
事件驱动设计(Event Driven Design,简写 EDD)是一种软件设计范式,其中程序的执行流由外部事件(如用户输入、系统信号、网络数据等)来决定。这种设计方法广泛应用于图形用户界面(GUI)、网络服务器、实时系统等领域,旨在提高系统的响应能力和灵活性。
事件驱动设计是一种强大且灵活的设计模式,特别适用于需要处理大量异步操作和实时数据流的系统。通过解耦组件、提高灵活性和响应性,事件驱动设计可以帮助构建高效、可扩展的应用程序。然而,它也带来了复杂性和调试困难等挑战,需要在设计和实现时仔细权衡。
-
事件驱动设计的核心要素
- 事件源(Event Source):产生事件的对象或系统组件。例如,用户点击按钮、传感器数据更新等。
- 事件(Event):表示系统中发生的一个有意义的变化或动作。例如,鼠标点击事件、键盘输入事件等。
- 事件队列(Event Queue):用于存储未处理的事件,确保事件按照发生的顺序被处理。
- 事件监听器(Event Listener):对特定事件感兴趣的对象,负责处理事件。例如,按钮点击事件的处理函数。
- 事件调度器(Event Scheduler):负责从事件队列中取出事件并分派给相应的事件监听器。
- 回调函数(Callback Function):事件发生时,系统会调用预先注册的回调函数来处理事件。
-
事件驱动设计的优点
- 提高响应能力:事件驱动设计使得系统能够快速响应外部事件,提高了用户体验。
- 解耦组件:事件驱动设计通过事件和监听器的机制,解耦了事件发送者和接收者之间的联系,使得系统组件更加独立和可重用。
- 简化并发处理:事件驱动设计通常采用单线程的事件循环来处理事件,避免了多线程编程中的复杂性和潜在的死锁问题。
- 易于扩展:由于组件之间的低耦合性,新的组件可以很容易地添加到系统中,只要它们能够产生或处理相应的事件。这使得系统能够方便地适应不断变化的业务需求。
-
事件驱动设计的应用场景
- 图形用户界面(GUI):几乎所有现代GUI框架(如Qt、Java Swing、WPF等)都采用了事件驱动设计。
- 网络服务器:许多高性能网络服务器(如Node.js 、Nginx等)采用事件驱动设计来处理大量的并发连接。
- 游戏开发:游戏中的许多交互和动画效果都依赖于事件驱动设计。
- 嵌入式系统:许多嵌入式系统(如智能家居设备、工业控制系统等)采用事件驱动设计来处理实时事件。
DDD(Domain Driven Design)
-
DDD 是通过领域划分和领域建模等一些列手段来控制软件复杂度的方法论,主要是用来指导如何解耦业务系统,划分业务模块,定义业务领域模型及其交互。
-
领域驱动
开发过程不再以数据模型为起点,而是以领域模型为出发点,领域模型对应业务实体。
程序中主要表现为类、聚合根和值对象,更加关注业务语义的显性化表达,而不是数据的存储和数据之间的关系。
- 领域驱动的研发过程为:需求分析 ----> 领域分析 ----> 领域建模 ----> 核心业务逻辑 ----> 技术细节(DB、Cache、Message…)
- 数据驱动的研发过程为:需求分析 ----> 数据建模(ER图) ----> 建库建表,写 DAO 层 ----> 编写业务逻辑
DDD 和 MVC 对比
-
DDD 是领域驱动设计,侧重领域拆分,MVC 是软件架构设计,侧重代码拆分。
这两个是不同角度描述不同问题的,完全可以协同工作,没有谁替代谁一说。
这两者都是通用的跨语言的软件架构思想。
-
现在的微服务都是按照业务拆分的,它们可以拆出来复用,甚至做中台,广义来说也可以算是领域拆分,是一种 DDD 的思想。
-
MVC 是技术层面基于分层的软件架构,是一种范式代码分层
实体类:VO、DTO、PO、DO、Form
-
VO(View Object):视图对象,主要对应界面显示的数据对象。
对于一个 WEB 页面,或者 SWT、SWING 的一个界面,用一个 VO 对象对应整个界面的值。
-
DTO(Data Transfer Object):数据传输对象,主要用于远程调用等需要大量传输对象的地方。
比如一张表有 100 个字段,那么对应的 PO 就有 100 个属性。但是界面上只要显示 10 个字段,客户端用 WEB service 来获取数据,没有必要把整个 PO 对象传递到客户端,这时就可以用只有这 10 个属性的 DTO 来传递结果到客户端,这样也不会暴露服务端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为 VO。在这里,泛指用于展示层与服务层之间的数据传输对象。
-
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
-
PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO 的一个(或若干个)属性。
最形象的理解就是一个 PO 就是数据库中的一条记录,好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
-
Form :表单对象,一般用于在 Controller 层接收前端参数。
相关文章:

常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD
三层架构(View Service Dao) 三层架构是指:视图层 view(表现层),服务层 service(业务逻辑层),持久层 Dao(数据访问层) 表现层:直接跟前…...
Springboot技术栈常见问题及搭建步骤
一. SpringBoot介绍 1.1. 引言 为了使用SSM框架去开发, 准备SSM框架的模板配置 为了使Spring整合第三方框架, 单独的去编写xml文件 导致SSM项目后期xml文件特别多, 维护xml文件的成本是很高的 SSM工程部署也是很麻烦, 依赖第三方的容器 SSM开发方式很是笨重 1.2 SpringBoot …...

session 共享服务器
1.安装 kryo-3.0.3.jar asm-5.2.jar objenesis-2.6.jar reflectasm-1.11.9.jar minlog-1.3.1.jar kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar memcached-session-manager-2.3.2.jar …...

vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色
项目中需要实现一组预定义查询,每一个查询按钮在选中时右上角显示一个角标,展示当前查询返回的数据条目。 1、text-color="#3785FF" fill="#E6EAF1" 处理选中时的字体颜色和背景色,如上图,分别为蓝色和浅灰色。 2、badge中:value="selectedRadio…...

【Linux】-学习笔记10
第八章、Linux下的火墙管理及优化 1.什么是防火墙 从功能角度来讲 防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) …...

鸿蒙NEXT开发案例:九宫格随机
【引言】 在鸿蒙NEXT开发中,九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖,用户可以随机获得不同奖品,增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能,并通过代码解析展示实现细节。 【环境准…...

深度解析:RTC电路上的32.768KHz时钟的频偏及测试
1、什么是RTC RTC是Real-Time Clock(实时时钟)的缩写,通常在电子产品中,是用时钟电路(外部采用时钟芯片,比如AiP8563)或时钟模块(SOC内部包含了时钟模块,只需要外接32.768KHz晶振)来…...
Scala的泛型
需求:定义一个名为getMiddleEle 的方法用它来获取当前的列表的中间位置的值中间位置的下标 长度/2目标:getMiddleEle(List(1,2,3,4,5)) > 5/2 2 > 下标为2的元素是:3 getMiddleEle(List(1,2,3,4)) > 4/2 2 > 下标为2的元素是:3格式如下: 定义一个函数的格式:def…...
OpenGL ES详解——glUniform1i方法是否能用于设置纹理单元
glUniform1i 方法确实可以用于设置纹理单元(texture unit)。在OpenGL中,纹理单元是图形硬件的一部分,它允许你同时绑定多个纹理,并在着色器程序中通过uniform变量来选择使用哪个纹理。 通常,纹理单元通过整…...

探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型
随着多模态技术的不断发展,越来越多的模型被提出以解决跨文本与图像等多种数据类型的任务。Janus-1.3B 是由 DeepSeek 推出的一个革命性的模型,它通过解耦视觉编码并采用统一的 Transformer 架构,带来了一个高度灵活的 any-to-any 多模态框架…...
论文信息搜集
系列博客目录 文章目录 系列博客目录1.秩典型相关分析及其在视觉搜索重排序中的应用《Rank canonical correlation analysis and its application in visual search reranking》2.利用边信息的规范秩估计在多维谐波恢复中的应用《Canonical Rank Estimation Using Side Informa…...

实操给自助触摸一体机接入大模型语音交互
本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…...
图表的放大和刷新功能
正常图表渲染显示: // 漏斗ading动画 let myChartone; // 获取配置项 let optionone; // 获取漏斗的数据 let order; let pay_order; let pay_order_num; let pay_order_num_num; let optiones; // 漏斗渲染 function polt(data) {// 从名为data的对象中获取ordata属…...

SQLServer利用QQ邮箱做SMTP服务器发邮件
环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言…...

flutter 多文本,其中文本下划线往下移动
变态需求 flutter中再满足多行文本,文本内有多个样式,并且多个样式可触发事件的情况,将其中的一部分文本的下划线往下移 方式一: 实现 使用RichText组件,主要是看中里面的WidgetSpan可以穿child为一个widget 实现源…...

7.OPEN SQL
总学习目录请点击下面连接 SAP ABAP开发从0到入职,冷冬备战-CSDN博客 目录 编辑 1.OPEN-SQL 简单回顾 R3体系 OEPN-SQL 2.OPEN-SQL 读取数据 2.1Select 语句 select 1条数据 多条数据与into AS别名 2.2INTO 结构体 内表 例子 2.3FROM 选择动态表…...
Python轻松获取抖音视频播放量
现在在gpt的加持下写一些简单的代码还是很容易的,效率高,但是要有一点基础,不然有时候发现不了问题,这些都需要经验积累和实战,最好能和工作结合起来,不然很快一段时间就忘的干干净净了,下面就是…...

YOLOv8目标检测(三*)_最佳超参数训练
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…...

SpringBoot SPI
参考 https://blog.csdn.net/Peelarmy/article/details/106872570 https://javaguide.cn/java/basis/spi.html#%E4%BD%95%E8%B0%93-spi SPI SPI(service provider interface)是JDK提供的服务发现机制。以JDBC为例,JDK提供JDBC接口,在包java.sql.*。MY…...

uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)
1.引入iconfont的图标,只保留这两个文件 2.App.vue引入到全局中 import "./static/fonts/iconfont.css"3.pages.json中配置text为图标对应的unicode {"path": "pages/invite/invite","style": {"h5": {"…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...
[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...