三层构架和 MVC的区别和理解
1、三层构架和 MVC 意思一样么?
Java WEB 开发中,服务端通常分为表示层、业务层、持久层,这就是所谓的三层架构:
1、表示层负责接收用户请求、转发请求、生成数据的视图等;
2、业务层负责组织业务逻辑;
3、持久层负责持久化业务对象;
这三个分层,每一层都有不同的模式,即架构模式,如下图:

最开始学 Java WEB 的时候,认为 MVC 就是 Java 里的三层架构,后来又认识到这样的想法不对,升华到认为 MVC 是表示层的架构模式,表示层最常用的架构模式就是MVC。
这个话题其实十年前,Java 社区都已经讨论烂了,真是悲剧,因为后来我还一直认为:MVC 意思是模型层、视图层、控制器层,其实哪里来的这么多层?是不是还要来个Service 层、DAO 层、DTO 层?
这是不正确的认识……
MVC 就是 M——模型、V——视图、C——控制器,而层的英文是 tier(物理上)、或者 layer(逻辑上)。即,层有类似计算机网络那种从上到下的递进关系,而模型、视图、控制器没有从上到下的明确关系。
MVC 并非谁创造的理论,它只是被赋予一个世界通用的名字,任何有经验,有追求的程序员即使完全不知道 MVC 这个东西,也都会走向 MVC。
故我的认知最后升华为:MVC 是模型,视图,控制器,和三层架构不是一个东西。它们更不是什么视图层,模型层,控制器层,没有这个说法,但凡这么说的,要么就是习惯了这么说,要么就是理解错误。
2、MVC 是表示层的架构模式
Java WEB 的三层架构是一个设计上的分层思想,三层架构设计中的每层都有自己的架构模式,架构模式就是每层的套路,类似传统武术里的套路,每一层都有自己的套路,这个套路就是所谓的架构模式。
表示层最常用的套路就是 MVC ,它不是软件设计模式,这是不同的概念,硬要扯上关系,只能说 MVC——这个企业级开发架构中的表示层常用的架构模式包含了多个软件设计模式的思想。
比如,MVC 架构模式是多种设计模式的复合,也可以说是复合设计模式的体现:
1、Model 和 Controller 之间是策略模式 ,表示对同样的数据可以有不同的处理策略(算法),参考:接口的常用用法都有什么?策略设计模式复习总结
2、Model 和 View 之间是观察者模式,View 表示观察者, Model 是主题,View 订阅了主题(Model)……参考:发布订阅/回调模型的核心技术——观察者模式复习总结
MVC 在实际环境中有很多的变体和改进,只要体会其中思想,无需严格跟概念相同,比如常见的有经典 MVC 和 Web 开发的 MVC 架构模式。

登录用户也就是浏览器客户端(很多时候以计算机的角度看程序更容易理解程序)是和控制器——Controller 交互的,而客户端看到的是 View ,它看不到 model。
客户端里;输入用户名,密码 》发送http请求 》触发 Controller 调用 Model 的数据校验接口,Model 校验不符合,触发 Controller 选择登录失败的 View 返回给客户端,用户就看到一个登录失败的提示,之后客户端里输入正确的密码,重复之前的操作,如 model 校验 success,则触发 Controller 去做对应策略的选择,再调用 model 的登录接口来请求登录(策略设计模式),model 和数据存储系统交互,完毕之后触发 controller 更新 view(观察者设计模式)……用户就看到登录成功的提示了。
3、业务层的架构模式
业务层的架构模式有事务脚本模式、领域模型模式等等,企业应用中最关键的显然是业务层。
事务脚本模式是最简单,最容易掌握的,如果开发团队面向对象设计能力一般,而且业务逻辑相对简单,业务层一般都会采用事务脚本模式,因为简单
如果业务逻辑复杂,用事务脚本模式就很不明智了,简单点讲,就是违背了单一职责设计原则,Service 类成为万能的上帝,承担了太多职责……
3.1、事务脚本模式
事务这里代表表示层的一个请求,所谓脚本就是一个方法,所谓事务脚本就是将一次请求封装为一个方法,所谓事务脚本模式,就是将业务层的对象分为三类,其中:
1、Service 类封装业务流程,或者说是纯粹的界面上的业务流程
2、DAO 类只负责对数据的操作,也就是封装对持久层的访问
3、DTO(Student)类封装业务的实体对象,负责业务层内数据的传输流动
各个对象之间的关系,按照下图的方式组织起来——简单的学生管理业务层UML类图:

service类:包含一个 service 接口和对应的 service 接口的实现类,dao 类似,而 dao 和 service 是一种聚合关系,service 类聚合了 dao 类。
对于聚合:聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即 has-a 的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;
比如计算机与cpu、公司与员工的关系等,表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

DTO类:在 dao 和 service 中都有关系,属于依赖关系。即:dao,service 依赖 DTO 类来传输数据对象
依赖:是类 A 使用到了另一个类 B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是 B 类的变化会影响到 A;
比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖,表现在代码层面为:类B(DTO)作为参数被类A(dao,service)在某个 method 使用,这就是所谓业务逻辑的组织方式
3.2、为什么要用 Service 接口和 DAO 接口?
还得回到最基本的面向对象设计原则上去,有三条与此相关:
1、开闭原则
2、依赖倒转原则
3、里氏替换原则
依赖倒转原则:高层不依赖于低层,二者都依赖于抽象,也就是面向接口编程。用 Service 接口是让表示层不依赖于业务层的具体实现。用 DAO 接口是让业务层不依赖于持久层的具体实现
有了这两个接口,Spring IOC 容器才能发挥作用

举个例子,用 DAO 接口,那么持久层用 Hibernate,还是用 mybatis,还是 JDBC,随时可以替换,不用修改业务层的 Service 类的代码。dao,service 使用接口的意义就在此。
4、持久层的架构模式
持久层的架构模式有入口模式(MyBatis、JDBC 是入口模式的典型实践)、数据映射器模式(Hibernate 是数据映射器架构模式的典型实践)等等。篇幅有限,不多说。
一般来说,框架 > 架构模式 > 设计模式 > 设计原则
打个比方:
1、Hibernate 是一个持久层框架,是数据映射器架构模式的具体实现,实现时用到了工厂模式等软件设计模式,体现了依赖倒转、开闭、里氏替换等等设计原则。
2、SpringMVC 是一个表示层 MVC 架构模式的实现框架,是 MVC 架构模式的一种实现,实现时用到……设计模式等,体现了……设计原则,诸如此类。
前面总结了那么多,貌似有些跑。
三层构架和 MVC的区别和理解的更多相关文章
- 三层架构与MVC的区别
我们平时总是将混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. MVC是一个设 ...
- asp.net中三层架构与mvc之区别?
对于标题中的问题,如果是没有同时接触三层架构和mvc的初级.net开发人员,想必一定会非常糊涂和混淆.关于此我也百度过N回,看过N多帖子和 回答,但几乎没有人能表述清楚.近期我从典型mvc+entit ...
- 三层构架 和 MVC 是什么?
作者:肖继潮链接:https://www.zhihu.com/question/24291079/answer/27339010著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 企 ...
- 三层架构 与 MVC那点事儿
以下为转载内容: 地址 MVC与三层架构的异同点 首先先解释一下MVC. V即View.是视图的意思. C即Controler.是控制器的意思. M即Model,是模型的意思. 这三个里.最不容易理解 ...
- 三层架构和MVC
注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...
- Web项目的三层架构和MVC架构异同
http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
- [1] [转]软件架构之三层架构和MVC的关系
注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...
- 三层架构和MVC模式
目录[-] 1.三层架构 2.MVC 2.1 标准的MVC(Model-View-Controller) 2.2 Web MVC 3.三层架构和MVC的区别与联系 1.三层架构 三层架构(3-tier ...
- 关于三层架构与MVC的一些理解
刚毕业的时候,参与了一个上位机的系统开发.上位机所使用的是.net Windows Form技术. 当时,和一个北理的姑娘在一个项目组里.因为她来公司时间比较长,而且经验比较丰富,所以,上位机的架构由 ...
随机推荐
- java 实验 三 (2)(3)
(2)编写一个Java程序,声明一个数组,各元素如:{12, 23, 456, 222, 768, 93245}计算出所有元素的和以及所有元素的平均值:SumArray.java(3)编写一个Java ...
- 潭州课堂25班:Ph201805201 django框架 第五课 自定义简单标签,包含标签,模型类创建,梳理类创建 (课堂笔记)
自定义标签同自定义过渡器一样,要创建文件,在配置文件中以APP方法注册,对方法进注册,在 html 文件中引入,.. 由模板传参 在 在配置文件中改时区: 由视图函数传参 包含标签: 当有这种重复的代 ...
- koa2框架设置响应和请求头
https://koa.bootcss.com/#response 请耐心翻到网页下端,可以看到 设置响应头: ctx.set('Content-Type', 'application/zip') 添 ...
- React使用Styled-Componets来添加样式
React使用Styled-Componets来添加样式 Styled-Comonents是用JS中ES6 语法的方式来管理CSS样式的一个组件,解决了在import CSS文件时样式重复 安装 项目 ...
- [BZOJ2863]愤怒的元首
Description: Pty生活在一个奇葩的国家,这个国家有n个城市,编号为1~n. 每个城市到达其他城市的路径都是有向的. 不存在两个城市可以互相到达. 这个国家的元首现在很愤怒,他大喊 ...
- pymysql 使用twisted异步插入数据库:基于crawlspider爬取内容保存到本地mysql数据库
本文的前提是实现了整站内容的抓取,然后把抓取的内容保存到数据库. 可以参考另一篇已经实现整站抓取的文章:Scrapy 使用CrawlSpider整站抓取文章内容实现 本文也是基于这篇文章代码基础上实现 ...
- Python3从零开始爬取今日头条的新闻【三、滚动到底自动加载】
Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...
- (转)java程序员进入名企需要掌握哪些,立一个flag
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...
- Java 避免创建不必要的对象
最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象.如果对象是不可变的,它就始终可以被重用. String s = new String("stringette"); ...
- GMA Round 1 函数求值
传送门 函数求值 设函数$f(x)=x^{2018}+a_{2017}*x^{2017}+a_{2016}*x^{2016}+...+a_{2}*x^2+a_{1}*x+a_{0}$,其中$a_{0} ...