Java常见的软件设计模式
三层架构的定义:三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI) 、业务逻辑层(BLL)和数据访问层(DAL)三层架构。额外的还有一层实体类(Model) ,作为数据传递的载体,在各层之间传递数据。
USL:User Show Layer表示层(也可以叫UI,即User Interface用户界面)
BLL:Business Logic Layer业务逻辑层
DAL:Data Access Layer数据访问层
内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高(只负责单一功能)。
耦合:一个完整的系统,模块与模块之间,尽可能的使其独立存在,也就是说,让每个模块,尽可能的独立完成某个特定的子功能.模块与模块之间的接口,尽量的少而简单.如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分.这样有利于修改和组合.
简单点说就是:高内聚是指单一功能的要高内聚,都内聚在一起。两个模块之间的联系就是耦合,我们要尽量减少两个模块之间的联系,这就叫低耦合,但是耦合是避免不了的,低耦合的好处是:你一个模块要修改,对其他模块的影响会很低。并且,以后我们要是做大的项目,一个项目会进行分工,我们要是采用高内聚低耦合的做法,可以让我们每一个人都只要去关注自己写的就行了,有利于分工合作,不然要是耦合性很高的话,你要改一点东西,添加一些东西都得和别人商量协商,这个协商就很复杂,因为耦合性高,所以你们的代码都是紧密联系的,你们将会很难改动,一改动就得考虑多方面的影响。
表示层又称表现层UI,位于三层构架的最上层,与用户直接接触,主要是BS信息系统中的Web浏览页面。
业务逻辑层BLL的功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,会连接数据访问层DAL,访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达
数据访问层 DAL是数据库的主要操控系统,实现数据的增加、删除、修改、查询等操作,并将操作结果反馈到业务逻辑层BBL。
实体类库是数据库表的映射对象,在信息系统软件实际开发的过程中,要建立对象实例,将关系数据库表采用对象实体化的方式表现出来,辅助软件开发中对各个系统功能的控制与操作执行。
UI主要涉及的就是页面的展示。DAL主要涉及的是数据库的增删改查,BLL用于处理表示层传过来的请求,要是这个请求没有必要访问数据库就直接处理了给返回给表示层,要是得访问数据库就会去连接DAL层。实体类库就是用来接收数据库返回的信息的,他把数据库返回的信息封装到实体类里面,然后返回。
三层架构的设计的缺点:维护成本增加,因为需要各自维护每一个层了,而且代码的冗余度增加了。
一般使用三层架构的情况:系统的功能多,庞大,业务需求还在不断地增加,需要不断的维护时我们使用三层架构比较好,因为你改变其中一个层对其他的层的代码的影响会小一点呀。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pFV2hR6f-1666010089320)(第十九次任务-三层架构/image-20221014093810638.png)]
正规笔记
一、三层架构是什么?
首先我们要明白三层架构的内容有哪三层?答:UI表现层、BLL业务逻辑层、DAL数据访问层。关于三层架构的定义,官方的解释是:三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
官方给的解释其实也并不难理解,我们在开发一个完整的功能模块的时候,肯定会有用户界面,根据用户的选择就应该去执行对应逻辑代码,进行对应的逻辑处理,而逻辑处理往往大部分都是在和数据库打交道,需要对数据进行增删改查。所以我们把这个模块分为这几层还是比较容易理解的。由于这样的分层可以让代码的实现变得更加的有条理、有逻辑,所以我们把用户界面、逻辑处理、与数据库的交互分开实现,至于为什么各层之间采用接口相互访问,下面说“三层架构怎么用?”的时候着重说明。
二、为什么要用三层架构
在真实的业务开发中,往往是需要团队合作开发的,毕竟一个完整的实际项目,它的开发周期会很长,这就意味着里面会有非常多的功能模块,比如一个简单的图书管理系统,就有管理员对图书的增删改查、对用户的增删查改,用户对图书的增删查改等等。这样的一个简单项目由一个团队来开发只需要一到两天即可,而我们却用了整整两周不止。
那么既然需要团队协同开发,自然离不开功能模块的划分了,这时候就需要使用三层架构的思想了,在三层架构中,各层互相独立,完成自己该完成的任务,项目可以多人同时开发,开发人员可以只关注整个结构中的其中某一层(自己负责的那一层即可)。举一个简单的例子,我们要在数据库查找一个人,那么首先需要一个方法去数据库查找,需要查找的条件,比如id,那么我们就初步建立了一个方法 findById(int id)。然后要是这个人找到了,找到之后我们需要打印这个人的信息,那方法就应该进一步完善,需要添加返回值,所以方法就变为了这样的:User findById(int id)。这个方法是用来在数据库进行查询的,那万一没有这个人呢,或者找到这个人我需要把这个人进行一些列的包装处理呢?这一些列的逻辑操作我们就可以把它放在逻辑处理层来,在逻辑处理层创建一个方法,处理完了之后,返回给用户界面。
从另一个方面来说,三层架构有利于各层逻辑的复用,比如上面说到的图书管理系统中管理员可以对图书进行增删查改,我们将这些方法放在一个类中,再出现对用户的增删查改时,我们就可以复用这些代码,修改参数和返回值类型即可。
这样分层处理,也更有利于代码的移植、维护,比如数据库SQLServer 转 Oracle数据库时,我们只需要修改一个层即可,因为与数据库的交互都在数据访问层中。
综上所述,使用三层架构会有三个好处:1.有利于项目的分工合作 2.有利于逻辑层的代码的复用 3.利于代码后期的维护(即修改)且移植性也很好。
三、三层架构怎么用?
使用三层架构时,我们首先要先创建好不同的包,每一个包对应三层架构的一个层。下面我通过一个学生登录功能的案例给大家讲解三层架构的用法。
首先我们在数据库中创建了 student表,结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Up8KoPVK-1666010089322)(第十九次任务-三层架构/image-20210422102615511.png)]
创建数据传递的载体实体类,一般我们将实体类放在domain/pojo/entity 这三者其中一个的包下,实体类的属性需要与数据库中的表一一对应。
我在 src 目录下创建了存放实体类的包:entity,然后在包下创建了Student类,它的属性和数据表student的属性一一对应,然后在实体类中给各个属性创建了对应的get/set方法,创建了有参/无参构造方法以及toString()方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQdU0IhN-1666010089323)(第十九次任务-三层架构/image-20210422103234603.png)]
创建工具包util,用于存放一些常用且不变的方法,比如IO流的读写,反反复复都是那些代码,我们就将这些重复的代码抽取出来将它封装成一个工具类,在我们需要用到这个方法的时候,直接调用即可。在验证登录这个案例里面,我们将连接数据库需要的代码抽取出来,这是因为每一次对数据库表进行增删改查访问的时候都需要连接数据库,所以将它抽取成工具类方便使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWMAkNld-1666010089323)(第十九次任务-三层架构/image-20210422110700621.png)]
创建数据访问层dao,在数据访问层中将对数据库表进行操作的方法写在接口 StudentDao 中,然后通过实现类 StudentImpl 写具体操作数据库表的逻辑代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGRfRFF1-1666010089324)(第十九次任务-三层架构/image-20210422104819850.png)]
先将需要用到的方法都封装好,不写方法的实现,用到某一个方法,写这个方法的具体实现。这里我们要做的是登录验证,所以我们封装了登录方法 login ,接下来我们分析:验证登录肯定需要学生先输入用户名和密码,有了用户名和密码之后去数据库表中查对应的数据,查到了就将这个学生的信息打印出来。经过分析我们知道方法的参数就是 name 和 password ,返回值就是这个学生 Student。
方法的具体实现,就是通过sql语句对数据库表进行操作,都是固定的模板,通过 JDBCTemplate模板 调用实现的方法即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8srzQSDg-1666010089325)(第十九次任务-三层架构/image-20210422105032099.png)]
创建业务逻辑层service,业务逻辑层主要是对具体问题进行逻辑判断与执行操作,接收到表现层 UI 的用户指令后(用户某一步操作),会连接数据访问层 DAL进行业务处理。访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的修改、获取、删除等功能,并将处理结果反馈到表示层 UI 中,实现软件功能。
在登录案例里面,我们通过学生输入的名字和密码在数据库表里进行查找,如果没有,我们就告诉学生输入的姓名或者密码错误;如果学生输入的信息为空,那么我们就根本不用访问数据访问层的方法,直接提示用户输入错误。这一系列的逻辑判断我们都写在逻辑层service里面。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvTN6y2q-1666010089326)(第十九次任务-三层架构/image-20210422112359515.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKyr4jLy-1666010089327)(第十九次任务-三层架构/image-20210422112422703.png)]
创建用户表示层view,表示层又称表现层 UI,位于三层构架的最上层,与用户直接接触,主要是 B/S 信息系统中的 Web浏览页面,由于我们还没有使用Web页面,所以我们的用户表示层,就是现在大家写的主函数里用户输入的信息。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » Java常见的软件设计模式