实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中。

  关键词:三层结构(三层架构)MVC框架(思想)基于J2EE/BS软件结构的三层架构Service/Model/Controller三者的区别

  立场:三层结构绝不等同于MVC,二者的思想不相同!!!但从代码与程序的物理逻辑构件组织的角度来看,会有一定的联系。

一、三层结构(3-Tier Architecture)

  1. 目的:为了服从“高内聚低耦合”的思想,模块化的软件工程思想,是基于分层架构下的一种常用的分层架构模式的一种

  2.优点:降低层与层之间的依赖、标准化。

1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间

  3.缺点:系统架构复杂,不适合小型项目。

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

  4.定位:最经典/最常见的软件体系架构设计中的一种。常见的其他软件架构设计还有:分层模式(含:三层结构)、客户端-服务器模式、主从设备模式、管道-过滤器模式、代理模式、点对点模式、事件总线模式、模型-视图-控制器(MVC)模式、黑板模式、解释器模式。

  5.哪三层?分层式结构一般分为三层,从下至上分别为:数据访问层(Data Access Layer)、业务逻辑层(Business Logic Layer,又或称为领域层,Domain)、表示层(又称为界面层,User Interface Layer)。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即把这三个层放置到一台机器上。

[图片来源于 百度]

  三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。

  6.数据访问层:主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成各个对数据文件的操作。而不必管其他操作。主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。

  7.业务逻辑层:主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

  8.界面层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx、jsp,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。

二、MVC框架(Model View Controller)

  1.定义:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计模式的典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

  2.简介:

  ①MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

  ②MVC指MVC模式的某种框架,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP(View) + Servlet(Controller) + JavaBean(Model)的模式。

[基于Struct2的MVC设计]

  设想Java Web(B/S架构+前后端分离):

    Model:将处理结果全部封装于会话、响应中,部分处理以抛出异常形式,交由最上层(渲染到用户视图)处理(异常)。

      异常渲染层:处理下层抛出的异常,调度页面或者输出JSON。

  3.MVC

  Model(模型)表示应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。

  View(视图)表示应用程序中处理数据显示的部分。 通常视图是依据模型数据创建的。

  Controller(控制器)处理输入(写入数据库记录),是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

  

[图片来源 百度]

实践过程中,每个人对MVC的理解不同,其实现方式与软件的设计也就会不同了,无统一严格的实践标准,尤其是在M、V、C三者之间的通讯关系,可谓是百花齐放。

附:

实际上它们完全是不同的概念。

框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。

三、小结

  重申立场:三层结构绝不等同于MVC,二者的指导思想不相同!!!但从代码与程序的物理逻辑构件组织的角度来看,会有一定的联系。

  MVC中的Model可以类似看做三层结构中的业务逻辑层(不完全是Model)+数据访问层;

  MVC中的View可以类似看做三层结构中的UI层(不完全是View)。

  而Controller绝不可以等效于三层结构中的任一层。

MVC模式与三层架构联系:

ui (view)←(contorller)

***********************

bll  (model)

***********************

dal (model)

    View-UI Layer  |   Controller-Bussiness Layer  |  Model-Data Access Layer 其实这样是错误的 。

  MVC是表现模式(Presentation Pattern); 三层架构是典型的架构模式(Architecture Pattern)。

  三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。

  即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技术。

  [有待经过时间的洗礼,再作校正]

  

四、参考文献

  1.【10种常见的软件架构模式 - 博客园】https://www.cnblogs.com/IcanFixIt/p/7518146.html

  2.【三层结构 - 百度百科】https://baike.baidu.com/item/三层架构/11031448?fr=aladdin

  3.【MVC - 百度百科】https://baike.baidu.com/item/MVC框架?fromtitle=mvc&fromid=85990

  4.【MVC模式与三层架构的区别 - 博客园】https://www.cnblogs.com/yourshj/p/5197310.html

  5.【MVC中 model view controller 关系 - 博客园】https://www.cnblogs.com/baimangguo/p/6554351.html

  6.【struct2与MVC及环境搭建】https://blog.csdn.net/linerzong/article/details/8656250

三层结构与MVC的更多相关文章

  1. 传统三层结构和MVC之于贫血模式和充血模式以及领域建模

      相信很多人跟我一样,一开始在使用贫血模式的三层结构:抽象出来一个贫血的实体封装,然后把对模型的所有操作,分离出来,分离到BLL层去,然后DALL层负责把这些操作和数据库产生映射,负责读写删改的操作 ...

  2. 三层结构、MVC的简介

    以前总是听说什么三层结构.什么MVC,但是一直傻傻分不清这是什么意思,下面来简单介绍一下它们吧~ 1.三层结构 在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层 1)表现层 也就是我 ...

  3. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

  4. mvc与三层结构

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

  5. mvc与三层结构终极区别

    http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zhhh/archive/2011/0 ...

  6. JavaWEB 常用开发模式MVC+三层结构

    MVC开发模式: M:  Model   -- JavaBean C:  Controler   --  Servlet V: View   --- JSP 不会在word里面画画,所以就直接截了 老 ...

  7. java中的mvc和三层结构究竟是什么关系

    一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了. 屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库 ...

  8. 三层架构与MVC的区别

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

  9. 三层架构和MVC

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

随机推荐

  1. Linux下设置VSCode为默认的文本编辑器

    解决方法 执行一下命令 xdg xdg-mime default code.desktop text/plain Debian alternatives system sudo update-alte ...

  2. 在Vue框架中使用百度地图

    1.首先在index.html中引入百度地图 <script type="text/javascript" src="http://api.map.baidu.co ...

  3. av_seek_frame() 定位为什么不准呢?

    初次学习和使用ffmpeg,电脑系统有点老,没办法使用最新版的ffmpeg 3.3,只能从别处下载了一个2.8版的用用,官网提供的历史版本都没有我电脑可用的版本. 花了两天时间学习并写了一个简单的处理 ...

  4. vue学习(3)

    回顾昨天内容 1.let和const 2.模板字符串 `` 插变量${变量名} 3.箭头函数 function(){} == ()=>{} 1.this的指向问题 2.arguments不能使用 ...

  5. Day17--Python--面向对象--成员

    成员 class Person: def __init__(self, name, num, gender,birthday): # 成员变量(实例变量) self.name = name self. ...

  6. Altium Designer 18 ------ 原理图和PCB元器件互相查找

    方法一:单击选中原理图中元器件,然后单击tools>Seclect PCBcomponents,即可在PCB中看到该器件的高亮显示: 方法二:单击Tools>Cross Select Mo ...

  7. C# 实现身份验证之WebApi篇

    今天再来总结关于如何实现WebApi的身份验证,以完成该系列所有文章,WebApi常见的实现方式有:FORM身份验证.集成WINDOWS验证.Basic基础认证.Digest摘要认证  第一种:FOR ...

  8. bzoj1009 KMP+矩阵dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(<=Xi<=), ...

  9. GlusterFS分布式文件系统部署及基本使用(CentOS 7.6)

    GlusterFS分布式文件系统部署及基本使用(CentOS 7.6) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Gluster File System 是一款自由软件,主要由 ...

  10. 【SQL】SQL中on条件与where条件的区别

     #前言 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1.on条件是在生成临时表时 ...