分层架构理论基础

news2024/11/29 0:35:14

一、三层架构

1、什么是三层架构

         三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分:表示层User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。  

         区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层

 

2、个层级的作用

表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问

业务逻辑层:主要负责对数据层的操作。也就是说把一些数据层的操作进行组合

数据访问层:主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成各个对数据文件的操作。而不必管其他操作。

3、常见三层架构关系-饭店

                服务员(表示层):待客/提交菜单 (客户)

     厨 师(业务逻辑层):取材/炒菜/交菜  (逻辑处理)

     采购员(数据访问层):采购 (数据库访问数据)

 4、三层架构中各功能模块如何联系

        这里就要提到Entity(实体层):它不属于三层中的任何一层,但是它是必不可少的一层。对于大量的数据来说,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把员工信息传递到下层,信息包括:员工号、姓名、年龄、性别、工资.......用变量做参数的话,那么我们的方法中的参数就会很多,极有可能在使用时,将参数匹配搞混。这时候,如果用实体做参数,就会很方便,不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。这样做也提高了效率

 

两个相同功能的方法,User实体封装了userId、name、age、address 。

5、Entity在三层架构中的作用

        1)实现面向对象思想中的"封装";

        2)贯穿于三层,在三层之间传递数据;(注:确切的说实体层贯穿于三层之间,来连接三层

        3)对于初学者来说,可以这样理解:每张数据表对应一个实体,即每个数据表中的字段对应实体中的属性(注:当然,事实上不是这样。         为什么?        1>)可能我们需要的实体在数据表对应的实体中并不存在        2>)我们完全可以将所有数据表中的所有字段都放在一个实体里

        4)每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。

6、三层架构的优势

        1)结构清晰、耦合度低

        2)可维护性高,可扩展性高

        3)利于开发任务同步进行, 容易适应需求变化

7、三层架构的劣

        1)降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成

        2)有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代

        3)增加了代码量,增加了工作

二、MVC模式

1、MVC模式是什么

        MVC是一种分层开发的模式,其中:

        M:Model,业务模型,处理业务

        V:View视图,界面展示

        C:Controller控制器,处理请求,调用模型和视图

        控制器serlvet)用来接收浏览器发送过来的请求,控制器调用模型javaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后在交由视图JSP)进行数据展示。

2、MVC好处

        1)职责单一。每个角色做它自己的事,各司其职。

        2)有利于分工协作。

        3)有利于组件重用

3、MVC模式在三层架构中的体现

数据访问层:对数据库的CRUD基本操作(单操作

业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层 的 selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层 的 insert() 方法进行数据的添加操复合操作

现层:接收请求,封装数据,调用业务逻辑层响应数

 

4、MVC模式在三层架构的每一层都有特有的包名称:

表现层: com.java.controller 或者 com.java.web或者 com.java.action

业务逻辑层:com.java.service

数据访问层:com.java.dao 或者 com.java.mapper

5、通过 MVC 和 三层架构 的学习,有些人肯定混淆了。那他们有什么区别和联系?

         如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构 中的表现层,而 MVC 模式 中的 M(模型)就是 三层架构 中的 业务逻辑层数据访问层

       可以将 MVC 模式 理解成是一个大的概念,而 三层架构 是对 MVC 模式 实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化

三、层次与名词解释

1、Controller层

        本层定义接口并调用service层接口方法完成业务逻辑。功能:接受前端请求,调用service,接受service返回的数据,之后响应给客户端。

2、Service层

        service层为业务服务,调用mapper层并提供给controller层使用,间接和数据库打交道。项目结构包括两部分,接口文件和接口实现类文件,接口文件中定义在controller层中调用的service层方法;接口实现类文件中完成service层接口中定义的方法的实现。注意:这里接口实现类中方法的实现是指业务逻辑的实现,可能有些方法并不能在实现类里完成真正意义上的实现,还需要在mapper层文件完成其真正意义上的实现(主要是和数据库交互)。

3、Mapper层

        mapper层为操作数据库的一层。mapper层分为两部分,mapper接口层和mapper.xml层。mapper接口层:定义在service接口中没有完成真正实现,需要通过书写SQL语句才能完成其功能的方法。

 4、Entity

        也就是所谓的model,也称为pojo层,是数据库在项目中的类,该文件包含实体类的属性和对应属性的setget方法。实体类中属性同数据库表字段一一对应,对于相应的setget方法一般不需要书写,实体类上引入@Data注解,会自动为实体类注入getset以及toString方法,减少代码量。

5、VO

        视图对象,用于展示层,把某个指定页面的所有数据封装起来,方便前端获取数据,后端将前端需要 的数据做整合,打包成一个类。使用场景:如果在前端页面需要展示经过某些数据库操作才能展示的特定数据,一般在vo层中把操作过程中涉及的数据进行封装,方便前端获取。并在controller层定义对应接口时把返回类型规定为vo类。

6、DTO

        数据对象传输层,负责屏蔽后端实体层,将UI要的数据进行重新定义和封装。因为后端在实际业务场景中需要存储大量数据,而用户需要的数据只是一部分,为了快速获取用户需要的数据,应该把用户经常用到的数据在dto层中进行封装,在调用服务层时,只需要调用一次便可完成所有的逻辑操作。

7、POJOVODTO......都是什么?

 

PO(persistant object) 持久对象

        在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了。通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的 java 对象。最简单的 PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。 PO 中应该不包含任何对数据库的操作。

DO(Domain Object)领域对象

        就是从现实世界中抽象出来的有形或无形的业务实体。

TO(Transfer Object) ,数据传输对象 

        在应用程序不同 tie( 关系 ) 之间传输的对象

DTO(Data Transfer Object)数据传输对象

        这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于表示层与服务层之间的数据传输对象。

VO(value object) 值对象 

        视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来

BO(business object) 业务对象

        从业务模型的角度看 , UML 元件领域模型中的领域对象。封装业务逻辑的 java 对象 , 通过调用 DAO 方法 , 结合 PO,VO 进行业务操作。 business object: 业务对象 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个 PO ,工作经历对应一个 PO ,社会关系对应一个 PO 。 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO 。 这样处理业务逻辑时,我们就可以针对 BO 去处理。

POJO(plain ordinary java object) 简单无规则 java 对象

        纯的传统意义的 java 对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录persisent object 完全是一个符合 Java Bean 规范的纯 Java 对象,没有增加别的属性和方法。我的理解就是最基本的 Java Bean ,只有属性字段及 setter getter 方法!。

DAO(data access object) 数据访问对象

        是一个 sun 的一个标准 j2ee 设计模式, 这个模式中有个接口就是 DAO ,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和 PO 结合使用, DAO 中包含了各种数据库的操作方法。通过它的方法 , 结合 PO 对数据库进行相关的操作。夹在业务逻辑数据库资源中间。配合 VO, 提供数据库的 CRUD 操作。

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

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

相关文章

容器运行时与k8s概述

容器运行时与k8s概述 首先我们要明确一个知识点就是容器本质上就是一个进程,一个特殊的进程,是通过 Namespace 实现资源(网络、文件系统等)隔离,通过 Cgroups 实现资源(CPU、内存)限制&#xff…

Kernel怎么跳转到Android:linux与安卓的交界

上一篇写了Uboot怎么到Linux kernel,这一章来看看linux kernel怎么到Android的。 虽然是零零碎碎的学习了一些关于Linux的知识,但是对于这个部分基本上没有站在系统的角度去看过。 1、前言 kernel的启动主要分为两个阶段。 1、阶段一 从入口跳转到s…

Python | 24K纯新手的Python环境搭建之路!~(Anaconda + Jupyter)

1写在前面 最近在搞Machine Learning,R中的包实在是不太给力,这方面还是要看Python的。😂 这里和大家分享一下我的Python环境搭建之路,图文介绍非常详细,希望帮助到大家。😘 由于我的电脑是M1 芯片的Macboo…

【Java】springboot 枚举参数

1/💤背景 很多大厂都要求了代码里面避免魔法值,如阿里巴巴开发规范 阿里巴巴Java开发手册1.4.0 ,那么使用枚举就是比较好避免的一个办法,比如 性别 0-未知 1-男 2-女 【强制】不允许任何魔法值(即未经预先定义的常量&…

显卡、显卡驱动版本、cuda版本和Pytorch相互之间的依赖关系

问题 话不多说,本文主要就是探讨如何根据显卡和显卡驱动版本去选择相应的CUDA和Pytorch。 显卡 显卡驱动版本 打开cmd命令提示符,输入nvidia-smi然后按回车键: 需要关注两个地方: 显卡驱动版本:516.59显卡支持最高…

Zebec节点Zepoch销量接近800个,生态发展信心十足

Zebec Protocol目前已经获得了两轮历史融资额近4000万美元的融资,其投资者包括Coinbase、Distributed Global、OKX Blockdream Ventures 、Circle Venture等20多家全球一线投资机构,而在获得融资后Zebec Protocol也开始全力打造多链生态,以进…

第十章:聊聊ThreadLocal

是什么?能干嘛?常用API案例一以上代码存在的问题?演示线程池复用本地变量的情况ThreadLocal源码Thread,ThreadLocal,ThreadLocalMap 三者的关系?ThreadLocal 的 get 方法set、remove 方法总结ThreadLocal 之…

Java自动化测试调试中遇到的问题

前言:记录下遇到的问题 Java自动化测试在调试中遇到的问题总结 1、遇到的Waring:must be unique [WARNING] dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: com.vertica.jdbc:vertica-jdbc:jar -> duplicate declaration of version 10.…

python的安装及常用语法(一)

python的安装及简单使用python解释器的安装1. windows系统安装方法2. 测试安装是否成功PyCharm代码编辑器的安装python的基础语法1. “input”用法:用户输入信息2. “bin”用法:将十进制转换为二进制3. “print”用法:输出信息4. 练习1. 张三…

modbus协议讲解,上位机与PLC交互

开发过程中modbus-RTU需要电脑USB口对外交互,参考我的文章:C# 通过Com端口和单片机通讯(232/485/USB)_花开莫与流年错_的博客-CSDN博客_c#与单片机通信 上位机和PLC交互的消息在Excel中配置,配置后通过Modbus协议加载…

数据结构之-队列实现

队列是一个先进先出的结构,可以用链表呀,数组来实现它,我们今天用数组实现个队列,以优先级队列方式,我们看看怎么实现,优先级队列以队列存储时规则会将即将过期的或较小的数据存储在前面,这样取…

【生成式网络】入门篇(四):CycleGAN 的 代码和结果记录

CycleGAN是一个里程碑式的工作,开启了unpaired的风格迁移的先河,斑马转马的效果还是很震惊。 具体原理可以参考 https://zhuanlan.zhihu.com/p/402819206 老习惯,直接上code,然后按照code进行一些解释 代码参考自 https://github.…

自托管书签管理器LinkAce

本文完成于 9 月下旬,当时的版本是 v1.10.4,发稿时最新版本为 v1.10.5 什么是 LinkAce ? LinkAce 是一个自托管档案,用于收集您喜爱的网站的链接,并保存文章以供日后阅读。LinkAce 提供了一个长期存档来存储指向网站、…

NVIDIA 7th SkyHackathon(二)开发套件的安装与测试

1.NeMo 开源工具包 1.1 关于 NeMo NeMo(Neural Modules)是 NVIDIA 发布的基于 PyTorch 的开源工具包,它允许开发者快速构建、训练和微调会话式人工智能模型 NeMo 由 NeMo Core 和 NeMo Collection 组成,NeMo Core 为所有模型和…

[附源码]Python计算机毕业设计Django的中点游戏分享网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

内容理解之情感计算

导语 概念定义:情感计算是自然语言处理领域的重要研究方向之一,其目标是赋予计算机类似于人一样的观察、理解和生成各种情感表达的能力,它是一个高度综合化的跨学科领域,涉及计算机科学、心理学、社会学和认知科学等。通过多学科…

物联网卡有哪些类型

伴随着科学技术的不断升级,不断发展,5G和物联网必定成为未来生活的主角,而现在5G已经慢慢在我们生活越来越常见,这是我们肉眼可以看见的,其实物联网如同5G一样,在我们生活中也随处可见,如我们平…

谈谈Go语言中函数的本质

在很多编程语言中,都会有函数一说,今天我们来聊聊Go语言中的函数。 废话不多说,咱们直接上代码~ 代码 package mainimport "fmt"func main() {fmt.Printf("%T\n", function1)fmt.Printf("%T\n", function2)…

跨越速运如何构建实时统一的运单分析

作者:张杰,跨越速运大数据架构师(本文为作者在 StarRocks Summit Asia 2022 上的分享) 作为大型现代化综合速运企业,跨越速运拥有 3000 多家服务网点 ,日均处理 30 多万票运单。海量运单数据涌来&#xff…

博科交换机使用

博科交换机使用 ip查询 博科交换机的默认IP地址是10.77.77.77,用户名admin,密码:password。 ipaddrshowip修改 ipaddrset端口查询 交换机的端口表示为(A,B)或者(A,B;C,D)。 A,C表示交换机的…