常见软件设计模式介绍:三层架构、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 层接收前端参数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重庆轨道交通2号线建桥地铁站自动化监测

1. 项目概述 本次项目位于重庆市轨道交通2号线中大渡口区的建桥站,轨道交通2号线是重庆市首条开通运营的城市轨道交通,也是中国首条开通运营的跨座式单轨线路。建桥站为轨道交通2号线延长线中的一站,本站为高架侧式,临近恒大麓山…

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写,意为“最近最少使用”。它是一种常见的缓存淘汰策略,用于在缓存容量有限时,决定哪些数据需要被删…

噪杂环境(房车改装市场)离线语音通断器模块

一直在坚持,却很难有机会上热门,在现在这个以流量为导向的时代,貌似很难靠所谓的坚守和热爱把产品成功的推向市场了。目前的客户仍然是以老客户为主,应用场景主要是房车改装,根据九客户的需求定制化一些模块。因为没有…

Rust之抽空学习系列(四)—— 编程通用概念(下)

Rust之抽空学习系列(四)—— 编程通用概念(下) 1、函数 函数用来对功能逻辑进行封装,能够增强复用、提高代码的可读 以下是函数的主要组成部分: 名称参数返回类型函数体 1.1、函数名称 在Rust中&…

深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等

光猫IPv6设置后的效果对比图: 修改前: 修改后: 一、DNS来源 1. 网络连接 来源: 从上游网络(如运营商)获取 IPv6 DNS 信息,通过 PPPoE 或 DHCPv6 下发。 特点: DNS 服务器地址直…

【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理

强烈推荐这篇博客!非常全面的一篇文章,本文是对该博客的简要概括和补充,在不同技术栈中提供一种可行思路,可先阅读该篇文章再阅读本篇: FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBu…

聊一下前端常见的图片格式

1. JPEG (JPG) 概述:是一种有损压缩的图像格式,它通过去除图像中一些人类视觉不易察觉的细节来减小文件大小。它支持数百万种颜色,能够很好地呈现照片等色彩丰富的图像内容。优点: 压缩率高:可以在保持相对较好的图像…

【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】

目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现快速排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 6 8 7 9 0 1 3 2 4 5 (说明:第一行是元素个数&a…

企业级包管理器之 monorepomultirepo (8)

在企业级项目开发中,面对多个项目的管理,monorepo 和 multirepo 是两种常见的代码管理方案,它们各有特点与优劣,下面我们来详细了解一下。 一、基本概念 monorepo:“mono”在英语中有“单一的、单独的”之意&#xf…

【electron】electron forge + vite + vue + electron-release-server 自动更新客户端

基本信息 electron forge vue页面(中文):https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面(英文,中文版下面的tab无法点击):https://www.electronfor…

后端-带有多个动态查询条件的分页查询

page和pagesize是分页插件所带的参数,其他三个是模糊查询的条件字段 因为是路径动态?拼接 的形式,所以不需要注解requestbody,先封装到pageresult中,再把pageresult封装到result中。 后端给前端的返回值封装到Vo中

【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习 **集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。 使用于组合的算法是弱学习算法,即分类正确率仅比随机猜测略高的学习算法,但是组合之后的效果仍可能高于…

Java常用 Date 时间格式化、Calender日历、正则表达式的用法

目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…

jdk1.8安装及环境配置(最新最详细教学!!!)

jdk1.8安装: 看了网上很多关于jdk1.8的安装,我觉得有时候会让人云里雾里,虽然自己可能配置成功,不过没有一套自己的思路,我结合自己的经验来说一下。 jdk在windows有两种安装方式,一种是解压缩包&#xf…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…

httpsok-v1.18.0-SSL证书自动续期

🔥httpsok-v1.18.0-SSL证书自动续期 介绍 httpsok 是一个便捷的 HTTPS 证书自动续期工具,基于全新的设计理念,专为 Nginx 、OpenResty、Apache 等服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分…

Dynamics 365 CRM- 后端

Dynamics 365 CRM 后端插件语法示例 public IPluginExecutionContext context null;//上下文 public IOrganizationServiceFactory serviceFactory null;//组织服务工厂对象 public IOrganizationService service null;//Org服务对象//创建执行上下文 context (IPluginExe…

Linux驱动开发(12):中断子系统–按键中断实验

本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana,并且dashboard接入数据 大屏编号地址:Node Exporter Full | Grafana Labs 创建企微机器人 备注:群里若有第三方外部人员不能创建 机器人创建完成,记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…

[WiFi] WiFi安全加密WEP Vs WPA Vs WPA2 Vs WPA3整理

WiFi安全标准时间线 WEP(Wired Equivalent Privacy) WEP最早于1997年推出,是为了保护无线网络上的数据通信而设计的。当时,Wi-Fi技术还处于起步阶段,人们开始意识到需要一种安全协议来防止未经授权的访问和窃听。WEP被…