Get 三层架构

通过一些问题的思考,带着这些问题去了解一下三层架构叭!

1、什么是三层架构?
2、三层架构的作用是什么?如何体现?
3、三成架构针对的对象是什么?
4、三层架构如何应用?


文章目录

  • Get 三层架构
  • 三层架构
    • 1、内容
      • 1-1、表现层(User Interface layer)
      • 1-2、业务逻辑层(Business Logic Layer)
      • 1-3、数据访问层(Data access layer)
      • 【补】实体层(Entity)
      • 【注】三层架构之间的联系简单描述图
    • 2、三层架构的作用
    • 3、三层架构的应用体现:
    • 4、小结
      • 三层架构的优势
      • 三层架构的劣势

三层架构

1、内容

1-1、表现层(User Interface layer)

主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

1-2、业务逻辑层(Business Logic Layer)

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

1-3、数据访问层(Data access layer)

与数据库进行交互。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

【补】实体层(Entity)

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

  • 2、贯穿于三层,连接三层,在三层之间传递数据;

  • 3、可以理解为:每个我们需要的表(由数据表对应而来的表)对应一个实体,即每个表中的字段对应实体中的属性。(视图是根据需求可变化的,视图中的字段能够存储到相应的实体类中。但是一个实体类需要抽象出可能这个实体所需要的所有属性的集合,因此,只要实体类能够包含应用需求中的字段存储就可以。)

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

【注】三层架构之间的联系简单描述图

(用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)


实际上,除了上述三层和实体层外,往往在实际开发过程中还有工具类层。主要是一些工具的封装。

2、三层架构的作用

作为一个编程人员,高内聚,低耦合的思想是很重要的。当然,在三层架构中,这个也是密切相关的。

高内聚:一个模块中,各个元素彼此结合的紧密程度较高。
低耦合:一个完整的系统,模块与模块之间,尽可能地使其独立存在。即让每个模块,尽可能独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果两个模块之间的关系比较复杂的话,最好先考虑进一步划分,这样有利于修改和组合。

作用:解耦合。降低模块之间的耦合度。


3、三层架构的应用体现:

在不适用三层架构的设计思想时,用户界面、业务逻辑、操作数据等都是混在一起的。
首先,在原先的二层架构(基础)中代码可读性低,各个功能模块耦合性高,业务逻辑与用户界面与数据访问都是混着的。修改或者扩展代码的时候所付出的代价是很大的。
而三层架构针对于应用程序来说,在设计上将用户界面、业务逻辑、操作数据等划分开来,降低了各个代码块之间的耦合度,提升代码的阅读性、可扩展性等等。
最后,如何使用三层架构呢?将原来代码中业务逻辑、界面操作、数据库访问分层并且通过实体层进行联系并传递数据。并通过下面的源代码栗子进行三层架构的应用。

  • 项目架构

  • 数据访问层DAO接口

public interface StudentDao {/*** @Description //TODO  根据id查找学生* @Param  [id]* @return  com.wedu.entity.Student**/Student findOneById(int id);/*** @Description //TODO  验证登录* @Param  [name, password]* @return  com.wedu.entity.Student**/Student login(String name,String password);}
  • 数据访问层实现DAO Impl
package com.wedu.dao.impl;import com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper;
import com.wedu.dao.StudentDao;
import com.wedu.entity.Student;
import com.wedu.util.JDBCUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class StudentDaoImpl implements StudentDao {/*** 获取JDBCTemplate对象**/private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 数据库连接对象*/Connection conn = null;/*** 数据库操作对象*/PreparedStatement pstmt = null;/*** 结果集*/ResultSet rs = null;/*** @return com.wedu.entity.Student* @Description //TODO  根据id查找学生* @Param [id]**/@Overridepublic Student findOneById(int id) {//定义sqlString sql = "select * from student where id = ?";try {return template.queryForObject(sql, new BeanPropertyRowMapper<Student>(Student.class), id);} catch (EmptyResultDataAccessException e) {System.out.println("无此id编号的学生信息");return null;}}/*** @return com.wedu.entity.Student* @Description //TODO  登录判断* @Param [name, password]**/@Overridepublic Student login(String name, String password) {//定义sqltry {String sql = "select * from student where name = ? and password = ?";// 返回 Student对象return template.queryForObject(sql, new BeanPropertyRowMapper<Student>(Student.class), name, password);} catch (Exception e) {e.printStackTrace();return null;}}}
  • 业务逻辑层 Service 接口
package com.wedu.service;import com.wedu.entity.Student;public interface StudentService {/*** @return boolean* @Description //TODO 判断用户登录是否成功* @Param [name, password]**/boolean loginStu(String name, String password);/*** @return boolean* @Description //TODO  通过id查询用户信息* @Param [id]**/Student findStuById(int id);}
  • 业务逻辑层 Service Impl
package com.wedu.service.impl;import com.wedu.dao.StudentDao;
import com.wedu.dao.impl.StudentDaoImpl;
import com.wedu.entity.Student;
import com.wedu.service.StudentService;public class StudentServiceImpl implements StudentService {//创建StudentDaoImpl对象private StudentDao studentDao = new StudentDaoImpl();@Overridepublic boolean loginStu(String name,String password) {if(name == null || password == null){return false;}Student login = studentDao.login(name, password);if (login!=null){return true;}else {return false;}}@Overridepublic Student findStuById(int id) {Student findOne=studentDao.findOneById(id);
//        在哪边进行为空判断?return findOne;}}
  • 用户界面层
package com.wedu.view;import com.alibaba.druid.sql.PagerUtils;
import com.wedu.entity.Student;
import com.wedu.service.StudentService;
import com.wedu.service.impl.StudentServiceImpl;
import org.junit.Test;import java.util.InputMismatchException;
import java.util.Scanner;/*** @ClassName : Login* @Description //TODO  用户界面UI**/
public class TestUnits {private StudentService studentService = new StudentServiceImpl();private Scanner sc = new Scanner(System.in);//登录测试@Testpublic void login() {//1.键盘录入,接收用户名和密码System.out.println("请输入用户名:");String name = sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();//2.调用方法boolean flag = studentService.loginStu(name, password);//3.判断结果,输出不同语句if (flag) {//登录成功System.out.println("登录成功!");} else {System.out.println("用户名或密码错误!");}}/*** @return void* @Description //TODO   根据id查找学生* @Param []**/@Testpublic void findStuInfoById() {//1.键盘录入,接收用户名和密码System.out.println("请输入要查询的学生id:");int stuId;while (!sc.hasNextInt()) {//                要拿一个next()接一下。不然会陷入死循环。String stu = sc.next();System.out.println("请用户输入整数哦!");System.out.println("请重新输入吖:");}stuId = sc.nextInt();//2.调用方法Student stuInfo = studentService.findStuById(stuId);
//        3、判断结果if (stuInfo == null) {System.out.println("查询失败!");} else {System.out.println("此Id用户的信息如下所示:");System.out.println(stuInfo.toString());}}}

4、小结

三层架构的优势

  • 1,结构清晰、耦合度低
  • 2,可维护性高,可扩展性高
  • 3,利于开发任务同步进行, 容易适应需求变化

三层架构的劣势

  • 1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
  • 2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
  • 3、增加了代码量,增加了工作量。

三层架构(UBD)!!!相关推荐

  1. 此三层非彼三层——MVCamp;UBD

    学习了三年编程了,到如今这个阶段,開始接触架构,開始认识架构,怎样设计一个程序的结构,学名称"架构模式"(architectural pattern).个人经历告诉我这在编程中是一 ...

  2. 一个简单实用的,基于EF的三层架构

    到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会 ...

  3. 亮剑.NET的系列文章之.NET实现三层架构(三)

        最近一直在学习三层架构,前些天同样也写了一篇同样的博客,今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现.     先将实现三层架构的UML图给大家,帮助大家更好的理解三层. ...

  4. .NET应用三层架构分析

    2019独角兽企业重金招聘Python工程师标准>>> 近来在做一个.NET的项目,使用C#进行开发.项目采用常用的三层架构,稍微调查了一下,发现所接触到的.NET的项目基本都是采用 ...

  5. 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC

    阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...

  6. 使用三层架构实现简单的MVC登陆操作!并实现基本的增删改查功能!!

    一丶使用三层架构创建一个简单的MVC登录操作 1.首先,创建一个项目以及BLL层.DAL层.Entity层,如图一: 图一 2.创建一个数据库如图二: 图二 3基本工作已做好,接下来就编BLL层.DA ...

  7. 什么是三层架构?简单的介绍三层架构!

    三层架构(3-tierarchitecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(Presentation layer).业务逻辑层(Business Logic Layer). ...

  8. [三层架构+WCF]三层架构+WCF实现TaskVision

    前面的一篇博文DebugLZQ使用三层架构实现了TaskVision,并在后面利用Webservice代替ClassLibrary实现SQL Server 2008数据库操作提供程序.关于三层架构的理 ...

  9. 趣味理解:三层架构与养猪—《.NET深入体验与实战精要》

    为了更好地让初学者轻松入门,这里仍然采用趣味性的方式聊一些常用技术点,致力于.NET新手们的快速提高!知识都是普通的,关键是学习的思路.技术源于生活,技术原来可以这样学.抛砖引玉而已.  层次结构在现 ...

最新文章

  1. 区块链技术背后的运行逻辑
  2. SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值?
  3. 强制解包看 Swift 的设计
  4. 十分钟就能回顾Spring常问的知识点,带你突击面试没问题!
  5. Excel图表横坐标设置怎么做?(亲测)
  6. 人工机器:jetbot小车密码
  7. appium和selenium不同与相同之处
  8. 211. 添加与搜索单词 - 数据结构设计
  9. ASP.NET 错误
  10. c语言编程软件开机自动启动,C语言实现程序开机自启动
  11. python 百分比输出_获取Linux系统负荷百分比的python脚本
  12. Asp .Net Mvc在DeBug模式下设置自定义IP
  13. bzoj4850 [JSOI2016]灯塔
  14. GNU Linux系统变量(sysctl配置命令)综合使用
  15. ABAP术语-Update Task
  16. matlab求两个向量均值,matlab求两个总体的均值向量和协方差矩阵
  17. ​杭州,苏州,成都哪个最宜居?
  18. 第一届BMZCTF公开赛-WEB-Writeup
  19. Thrift 入门教程【转】
  20. matlab 三角函数 积化和差,三角函数之积化和差、和差化积及推导过程

热门文章

  1. 【Android】 Color 颜色设置
  2. 杰理之耳机声学结构设计【篇】
  3. muduo学习笔记-Acceptor类
  4. JS画地图--BingMap
  5. linux 词霸,Linux下的词霸
  6. Reveal 断点使用
  7. ML@矩阵微积分@Matrix calculus@Part1
  8. 2019网易前端实习面试(一、二面+hr面)
  9. 如何用本地Navicat连接宝塔上的Mongodb
  10. html在表格中加入虚线框,如何让html表格有虚线边框