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的区别和理解的更多相关文章

  1. 三层架构与MVC的区别

    我们平时总是将混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. MVC是一个设 ...

  2. asp.net中三层架构与mvc之区别?

    对于标题中的问题,如果是没有同时接触三层架构和mvc的初级.net开发人员,想必一定会非常糊涂和混淆.关于此我也百度过N回,看过N多帖子和 回答,但几乎没有人能表述清楚.近期我从典型mvc+entit ...

  3. 三层构架 和 MVC 是什么?

    作者:肖继潮链接:https://www.zhihu.com/question/24291079/answer/27339010著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 企 ...

  4. 三层架构 与 MVC那点事儿

    以下为转载内容: 地址 MVC与三层架构的异同点 首先先解释一下MVC. V即View.是视图的意思. C即Controler.是控制器的意思. M即Model,是模型的意思. 这三个里.最不容易理解 ...

  5. 三层架构和MVC

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...

  6. Web项目的三层架构和MVC架构异同

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

  7. [1] [转]软件架构之三层架构和MVC的关系

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...

  8. 三层架构和MVC模式

    目录[-] 1.三层架构 2.MVC 2.1 标准的MVC(Model-View-Controller) 2.2 Web MVC 3.三层架构和MVC的区别与联系 1.三层架构 三层架构(3-tier ...

  9. 关于三层架构与MVC的一些理解

    刚毕业的时候,参与了一个上位机的系统开发.上位机所使用的是.net Windows Form技术. 当时,和一个北理的姑娘在一个项目组里.因为她来公司时间比较长,而且经验比较丰富,所以,上位机的架构由 ...

随机推荐

  1. Android JNI 增强应用程序性能

    JNI全称Java Native Interface. 它为托管代码(使用Java编程语言编写)与本地代码(使用C/C++编写)提供了一种交互方式.它是与厂商无关的(vendor-neutral),支 ...

  2. ZOJ3967 : Card Game

    比赛的时候因为卡内存,在抠内存的时候改错了,导致赛内没有AC,赛后发现数组开的很小都可以AC. 分析题意我们发现,这题需要求出所有存在的直线形成的上凸壳,那么查询$[L,R]$时在凸壳上二分导数,找到 ...

  3. Flask实例化配置

    template_folder :指定模板存放路径,默认值:temolates from flask import Flask, url_for app = Flask(__name__,templa ...

  4. windows下安装Mysql—图文详解

    mysql安装过程及注意事项: 1.1. 下载: 我下载的是64位系统的zip包: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip的包: 下载后解压 ...

  5. Codeforces909C Python Indentation(动态规划)

    http://codeforces.com/problemset/problem/909/C dp[i][j]表示第i行缩进j的方案数. 当第i-1行为f时,无论当前行是f或s都必须缩进,即dp[i] ...

  6. pygame 笔记-8 背景音乐&子弹音效

    游戏哪能没有音效?这节我们研究下如何加背景音乐,其实也很简单: # 加载背景音乐 pygame.mixer.music.load(music_base_path + "music.mp3&q ...

  7. Asp.NET WebApi+Redis实现单用户登录实战演练

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  8. .NET上传大文件时提示Maximum request length exceeded错误的解决方法

    使用IIS托管应用程序时,当我们需要上传大文件(4MB以上)时,应用程序会提示Maximum request length exceeded的错误信息.该错误信息的翻译:超过最大请求长度. 解决方法: ...

  9. android构建过程

    参考: http://blog.csdn.net/shangmingchao/article/details/47375111 首先,需要了解一下构建APK的七大工具: ①aapt 全称是Androi ...

  10. [转] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

    前言:        同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.        oracle里面可以通过row_number() OVER (PARTITIO ...