前言
一直以来对于MVC设计模式和三层架构体系的理解都不够透彻,对于两个概念的认知过程是比较困难的,最初的状态是“奥,我懂了~”,然后一段时间后转变为“好像不太对,再看看……”,然后是“奥,不是原来想的那样,是这样的!”……这样的过程不断轮换刷新着我对两个概念的认知
总体上我个人对MVC和三层架构的理解可分为三个阶段
阶段一:MVC就是三层架构
先在大学里经老师讲授得知MVC一词,这里引用下百科对MVC的解释
MVC框架:
经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
贴一张图片更容易看明白MVC是个啥
当后来做Java Web项目的时候又接触到三层架构的概念,上网简单查了下资料,同样百科伺候
三层架构:
三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
你说巧不巧,都是MVC和三层架构都分了3层,然后我试着将视图层对应表示层,模型对应数据访问层,发现挺合适的,然后控制器也是负责处理流程,在中间起到枢纽作用,对应着业务逻辑层也挺合适,所以我当时的结论:MVC==三层架构
阶段二:MVC和三层架构关系不大
为什么会再次思考这两个概念的关系呢?当时学习SSM的时候,发现Spring MVC为啥名字会带MVC?那既然Spring MVC是一个MVC框架,那Spring和MyBatis在项目中扮演什么角色呢?
额,查资料吧,查来查去看了好多东西,各种各样的说法,主要还是缺乏项目经验,只是纸上谈兵,一开始呢学习的web项目是用Python的Flask框架做的,这里引用下Django的架构设计(Flask的百科没有讲其架构设计)
Django已经成为web开发者的首选框架,是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。Django其实也是一个MTV 的设计模式。MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图 [4] 。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式
但三层架构的概念是学习Java Web项目时接触的概念,很困惑怎么才能把Django的MVC(MTV)模式和常用的SSM三个框架对应起来(这里说一下对该疑惑后来正确理解:Django算是一个完整的Web框架,而Java Web的项目往往采用多个框架整合实现),这个认知过程是最艰难的,最后的结论就是——MVC是Web框架,而三层架构是项目的分层设计理念,所以两个概念不在一个层次上,关系不大
阶段三:实际上MVC和三层架构关系不浅
工作后我重拾这个问题,经过实际项目后,我逐渐加深了对两者的认知程度,首先是MVC和三层架构在软件设计原则上都是一种“分层”的思想,都是为了规范软件开发过程,提高开发效率,明确开发任务,降低维护成本的方案,MVC不仅仅是Web框架,像IOS的App开发也严格遵守该设计模式,只要涉及前后端的系统都都可以遵循MVC框架规范,而三层架构包含的范围可能更广,算是更加宏观的一个概念,很形象的例子就像SSH或SSM,他们其中的一个框架就是一个MVC框架了——我更喜欢把概念和实际应用对应起来理解,例如Spring MVC是表示层(UI)框架,MyBatis是数据访问层框架,Spring主要负责业务逻辑和为整个项目提供IOC容器等。
目前来说我对他们的理解可以用绘作两个图来阐述
宏观来看大致可以理解MVC是三层架构的UI层:
当然,结合实际的项目来理解也可以是这样的,毕竟Model是和数据紧密不分的:
以上为个人理解,如有不恰当的地方,还请指教,谢谢~