三层架构基础知识

这篇具有很好参考价值的文章主要介绍了三层架构基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.什么是三层?

UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

三层架构基础知识

每一层都各负其责,那么该如何将三层联系起来呢?

1、单项引用(见下图)

2、这时候实体层(Entity)来了。(注:当然,实体层的作用不止这些)

Entity(实体层):它不属于三层中的任何一层,但是它是必不可少的一层。

Entity在三层架构中的作用:

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

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

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

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

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

注:这里为什么说可以暂时理解为每个数据表对应一个实体??答:大家都知道,我们做系统的目的,是为用户提供服务,用户可不关心你的系统后台是怎么工作的,用户只关心软件是不是好用,界面是不是符合自己心意。用户在界面上轻松的增、删、改、查,那么数据库中也要有相应的增、删、改、查,而增删改查具体操作对象就是数据库中的数据,说白了就是表中的字段。所以,将每个数据表作为一个实体类,实体类封装的属性对应到表中的字段,这样的话,实体在贯穿于三层之间时,就可以实现增删改查数据了)

综上所述:三层及实体层之间的依赖关系:

三层架构基础知识

2.三层架构是什么?

首先我们要明白三层架构的内容有哪些。官方的解释是三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

官方给的解释其实也并不难理解,我们在开发一个完整的功能模块的时候,肯定会有用户界面,根据用户的选择实现不同的代码逻辑,而逻辑处理往往大部分都是在和数据库打交道,需要对数据进行增删改查。那么为了让代码的实现更加的有条理、有逻辑,我们就把用户界面、逻辑处理、与数据库的交互分开实现,至于为什么各层之间采用接口相互访问,下面说第三点的时候着重说明。

3.为什么要用三层架构?

在真实的业务开发中,往往是需要团队合作开发的,毕竟一个完整的实际项目,它的开发周期会很长,这就意味着里面会有非常多的功能模块,比如一个简单的图书管理系统,就有管理员对图书的增删改查、对用户的增删查改,用户对图书的增删查改等等。这样的一个简单项目由一个团队来开发只需要一到两天即可,而我们却用了整整两周不止。

那么既然需要团队协同开发,自然离不开功能模块的划分了,这时候就需要使用三层架构的思想了,在三层架构中,各层互相独立,完成自己该完成的任务,项目可以多人同时开发,开发人员可以只关注整个结构中的其中某一层(自己负责的那一层即可)。举一个简单的例子,我们要在数据库查找一个人,那么首先需要一个方法去数据库查找,需要查找的条件,比如id,那么我们就初步建立了一个方法 findById(int id),找到之后我们需要打印这个人的信息,那方法就进一个完善,有了返回值 User findById(int id)。这个方法是用来在数据库进行查询的,那万一没有这个人呢,或者找到这个人我需要把这个人进行一些列的包装处理呢?这一些列的操作我们可以把它放在逻辑处理层来,在逻辑处理层创建一个方法,处理完了之后,返回给用户界面。

从另一个方面来说,三层架构有利于各层逻辑的复用,比如上面说到的图书管理系统中管理员可以对图书进行增删查改,我们将这些方法放在一个类中,再出现对用户的增删查改时,我们就可以复用这些代码,修改参数和返回值类型即可。

这样分层处理,也更有利于代码的移植、维护,比如数据库SQLServer 转 Oracle数据库时,我们只需要修改一个层即可,因为与数据库的交互都在数据访问层中。

4.与两层的区别?

两层:

三层架构基础知识

(当任何一个地方发生变化时,都需要重新开发整个系统。"多层"放在一层,分工不明确耦合度高——难以适应需求变化,可维护性低、可扩展性低)

三层:

三层架构基础知识

(发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高)

综上,三层架构的优势:

  • 1,结构清晰、耦合度低

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

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

三层架构的劣势:

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

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

  • 3、增加了代码量,增加了工作量

5.三层架构怎么用?

使用三层架构时,我们首先要先创建好不同的包,每一个包对应三层架构的一个层。下面我通过一个学生登录功能的案例给大家讲解三层架构的用法。

  1. 首先我们在数据库中==创建了 student表==,结构如下:

    三层架构基础知识

  2. 创建数据传递的载体==实体类==,一般我们将实体类放在domain/pojo/entity 这三者其中一个的包下,实体类的属性需要与数据库中的表一一对应。

    我在 src 目录下创建了存放实体类的包:entity,然后在包下创建了Student类,它的属性和数据表student的属性一一对应,然后在实体类中给各个属性创建了对应的get/set方法,创建了有参/无参构造方法以及toString()方法。

    三层架构基础知识

  3. 创建==工具包util==,用于存放一些常用且不变的方法,比如IO流的读写,反反复复都是那些代码,我们就将这些重复的代码抽取出来将它封装成一个工具类,在我们需要用到这个方法的时候,直接调用即可。在验证登录这个案例里面,我们将连接数据库需要的代码抽取出来,这是因为每一次对数据库表进行增删改查访问的时候都需要连接数据库,所以将它抽取成工具类方便使用。

    三层架构基础知识

  4. 创建==数据访问层dao==,在数据访问层中将对数据库表进行操作的方法写在接口 StudentDao 中,然后通过实现类 StudentImpl 写具体操作数据库表的逻辑代码。

    三层架构基础知识

    先将需要用到的方法都封装好,不写方法的实现,用到某一个方法,写这个方法的具体实现。这里我们要做的是登录验证,所以我们封装了登录方法 login ,接下来我们分析:验证登录肯定需要学生先输入用户名和密码,有了用户名和密码之后去数据库表中查对应的数据,查到了就将这个学生的信息打印出来。经过分析我们知道方法的参数就是 name 和 password ,返回值就是这个学生 Student。

    方法的具体实现,就是通过sql语句对数据库表进行操作,都是固定的模板,通过 JDBCTemplate模板 调用实现的方法即可。

    三层架构基础知识

  5. 创建==业务逻辑层service==,业务逻辑层主要是对具体问题进行逻辑判断与执行操作,接收到表现层 UI 的用户指令后(用户某一步操作),会连接数据访问层 DAL进行业务处理。访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的修改、获取、删除等功能,并将处理结果反馈到表示层 UI 中,实现软件功能。

    在登录案例里面,我们通过学生输入的名字和密码在数据库表里进行查找,如果没有,我们就告诉学生输入的姓名或者密码错误;如果学生输入的信息为空,那么我们就根本不用访问数据访问层的方法,直接提示用户输入错误。这一系列的逻辑判断我们都写在逻辑层service里面。

    三层架构基础知识

    三层架构基础知识

  6. 创建==用户表示层view==,表示层又称表现层 UI,位于三层构架的最上层,与用户直接接触,主要是 B/S 信息系统中的 Web浏览页面,由于我们还没有使用Web页面,所以我们的用户表示层,就是现在大家写的主函数里用户输入的信息。

    三层架构基础知识

    可以看到,我们的用户界面只有一句核心代码,就是调用业务逻辑层的 loginStu() 方法,其他的处理全都通过三层架构的方式分开存放,代码的逻辑变得非常的清晰。

    ==注意:==

    这里解释为什么我们要先写接口再写实现类:使用接口是为了调用与实现解耦,带来的好处是可以各干各的

    先从工序上说,你在写上一层的时候,会用到下一层提供的逻辑,具体表现形式就是各种各样的service类和里面的方法。上一层开搞的时候,一定会知道的一个事是下一层会干什么事,比如“将传入编号对应的人员信息设置为离职”,但下一层的代码不一定已经一行一行写出来了。所以这会儿需要有个接口,让写上层代码的人先能把代码写下去。有各种理由可以支持这种工序的合理性,比如一般来说,上一层的一行代码会对应下一层的好多行代码,那先让写上层代码的人写一遍,解决高端层面的bug,会提高很多效率。

    再从抽象角度说,不同业务模块之间的共用,不一定是共用某段代码,也可能是共用某段逻辑框架,这时候就需要抽象一个接口层出来,再通过不同的注入逻辑实现。比如模块1是登记学生信息,模块2是新闻发布,看上去风马牛不相及。但分析下来如果两个模块都有共同点,顺序都是1、验证是否有权限 2、验证输入参数是否合法 3、将输入参数转化为业务数据 4、数据库存取 5、写log,那就可以写一个service接口,里面有上述5个函数,再分别写两个service实现。具体执行的时候,通过各种注入方法,直接new也好,用spring注入也好,实现不同的效果。

    这样做的另一个目的是为了后期的维护。当软件全部编好了,测试好了,然后给用户装好了,但是过一段时间,用户用着不爽,他又让做软件的人改变一些功能,这样软件开发人员只需要改实现类里面的代码,也就是只用改一个包下代码,不用这个包改一下,那个包里的代码还要改。因为项目大了,代码就是成万上亿行,用了接口的话,就起了这个作用。

    另外,不用接口的话,假如修改了dao中的代码,因为service引用了dao中的类,那么也要改变service里面的代码,改完之后要重新编译运行,当项目比较大的时候,编译和运行很浪费时间的,而且会产生一些意外,本来只要编译dao中的代码,现在不光要编译dao中的代码,还要编译service。因为你不用接口,间接着action里的代码也要改,因为action中引用了service中的类,到最后,就变成了,牵一发而动全身本来在各个层之间用了接口只需要改一处代码的,这下可好,全要改。

    ==实在理解不了,你就记住这句真理:使用接口是为了调用与实现解耦,带来的好处是可以各干各的。==文章来源地址https://www.toymoban.com/news/detail-455596.html

到了这里,关于三层架构基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软考——系统架构师】系统开发基础知识

    🔎这里是【软考——系统架构师】,关注我考试轻松过线 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 软件开发生命周期 1、需求规格说明书包括系统名称、功能描述、接口、基本数据结构、性能、设计需求、开发标准、验收原则等

    2024年02月08日
    浏览(63)
  • RISC-V— 架构基础知识学习

    CPU ,全称为 中央处理器单元 ,简称为 处理器 。 ARM (Advanced RISC Machines )是一家诞生于英国的处理器设计与软件公司,总部位于英国的剑桥,其主要业务是设计 ARM 架构的处理器,同时提供与 ARM 处理器相关的配套软件,各种 Soc 系统 IP 、物理 IP 、 GPU 、视频和显示等产品。

    2024年02月08日
    浏览(49)
  • 【STM32】基础知识 第六课 内核 & 架构

    4 个主动单元 + 4 个被动单元 主动单元 被动单元 Cortex M3 内核 DCode 总线 (D-Bus) 内部 FLASH Cortex M3 内核系统总线 (S-Bus) 内部 SRAM 通用 DMA1 FSMC 通用 DMA2 AHB 到 APB 的桥, 它连接的所有 APB 外设 AHB (Advance High-performance Bus): 高级高性能总线 APB (Advance Peripheral Bus): 高级外围总线 ICode 总线

    2023年04月24日
    浏览(68)
  • 【大数据】了解 YARN 架构的基础知识

    Hadoop YARN( Y et A nother R esource N egotiator)将 Hadoop 的存储单元即 HDFS(Hadoop 分布式文件系统)与各种处理工具编织在一起。 在 Hadoop 1.0 版本,也称为 MRV1 ( MapReduce Version 1 ),MapReduce 执行处理和资源管理功能。它由一个 作业跟踪器 ( Job Tracker )组成,它是唯一的主机。作业

    2024年01月21日
    浏览(65)
  • 【系统架构】第三章-信息系统基础知识

    软考-系统架构设计师知识点提炼-系统架构设计师教程(第2版) 信息系统的5个基本功能:输入、存储、处理、输出和控制 信息系统的发展: 诺兰模型:初始阶段、传播阶段、控制阶段、集成阶段、数据管理阶段、成熟阶段 信息系统的分类: 传统的信息系统分为:业务(数

    2024年02月11日
    浏览(58)
  • MySQL 基础知识(十)之 MySQL 架构

    目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层: 连接层:负责跟客户端建立连接、获取权限、维持和管理连接 核

    2024年02月20日
    浏览(47)
  • Nodejs后端架构基础知识和案例展示

    入门笔记,大神请绕路!!! 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 优点: 1.高并发 (高并发的

    2023年04月11日
    浏览(55)
  • 软考系统架构师知识点集锦七:计算机系统基础知识

    2.1.1计算机系统组成 2.1.2 存储系统          时间局部性 :指程序中的某条指令一旦执行,不久以后该指令可能再次执行,典型原因是由于程序中存在着大量的循环操作。          空间局部性 :指一旦程序访问了某个存储单元,不久以后,其附近的存储单元也将被访问,

    2024年02月06日
    浏览(49)
  • 第四章 云原生架构之Kubernetes基础知识

    ​ Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,简称 K8S。 K8S的本质是一组服务器集群,可以在对应服务器集群的每个节点上运行程序,来对节点中的容器进行管理 。类似Master-Work方式,每个服务器上安装特定的k8s组件,就可以形成集群,然

    2024年02月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包