谈谈MVC模式

作者: 阮一峰

日期: 2007年11月 8日

1.

如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architectural pattern),属于编程的方法论。

MVC模式就是架构模式的一种,它对我的启发特别大。我觉得它不仅适用于开发软件,也适用于其他广泛的设计和组织工作。

下面是我对MVC模式的一些个人理解,不一定正确,主要用来整理思路。

2.

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。

这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

3.

bg2007110801.jpg

我用Windows的计算器小程序为例,解释一下MVC模式,虽然它不一定使用这个模式编写。

在这个计算器程序中,外部的那些按钮和最上面的显示条,就是"视图层",那些需要运算的数字就是"数据层",执行加减乘除的那些内部运算步骤就是"控制层"。每一层执行不同的功能,整个程序的结构非常清楚。

如果我们扩大一点想象,就会发现,很多程序本质上都是这种模式:对外提供一组触发器(本例中是按钮),然后执行一些内部操作,最后返回结果。因此,MVC模式的应用是非常广泛的。

4.

bg2007110802.jpg

在我看来,不仅编写程序可以用MVC模式,家用电器也可以用。

以家用微波炉为例,可以将它也理解成三层结构。最简单的情况下,微波炉的操作用两个转盘实现,一个控制温度,另一个控制时间。这两个转盘就是"视图层"(view),而其内部的微波产生装置则是"数据层"(Model),这里的"数据"需要理解成"核心功能"。至于将用户通过转盘输入的信息,转换成对微波产生器的操作,则用"控制层"来实现。

如果每一层都是独立的,那么微波炉外部更换一个新潮的外壳,或者内部更换更大功率的微波产生器,完全可以在不更改其他层的情况下实现。这就是MVC模式的优势。

5.

再进一步,如果将MVC模式解释成"外观"、"机制"和"功能/数据"这三层结构,那么很多人类组织也可以通过MVC模式架构。

比如一家商场,完全可以分成三部分。一部分是仓库,负责提供商品,这是"功能层"(或者"数据层");另一部分是零售铺面,负责销售商品,这是它的"外观层";两者之间就是"机制层",包括柜台和仓库之间一切互动的机制。

这样区分以后,这个商场的结构就变得非常清楚,可以针对不同的层进行优化,提高效率。

6.

公司、政党、政府、医院、学校等等,这些组织不管是盈利性还是非盈利性的,都可以从MVC模式的角度,进行架构,由一个个执行特定功能、可重复使用的模块组成。

我在想,如果人类社会都是模块化结构,那会是怎样的情景?

(完)

留言(79条)

事实上很多人类社会中的组织都是模块化的,只有模块化才能更好的分工,实现specialization,提高效率。
另,其实计算机中的很多概念,包括模块化,都是模拟人类社会学来的,比如hyperlink就是来自人的associative memory。计算机本来就是人的发明,不可能脱离人而单独存在

……
不愧是文科生,真能联想,看得俺这个写代码的一脑门汗。

最近做的项目也是MVC结构的,没想到在这里能看到MVC的介绍……
阮大侠的兴趣广泛啊

厉害厉害,“真正困难的是算法和结构,前者需要好的数学基础,后者需要对所要解决的问题有全面深刻的理解和规划”,太精辟了,富于微言大义的魅力。
但真正的好程序、好系统还在于扎扎实实的功底和努力,所谓细节决定成败。

一个干了10年的程序员

搞企业管理也有,人财物各有所司的说法。

无论是人也好,程序也好
只要确定好各个层次之间的通信接口
关心就会简单明确起来

现在ASP.net、JSP好像都有自带的框架,PHP没有。不过Zend公司好像一直在开发这样的框架。

呵呵,太有才啦。不是学计算机的都能理解得那么透彻!~~真的很佩服楼主啊!~~~

对一个模式的理解只是到这的话,学面向对象的第一课的同学就可以做到了,楼主不过只是玩玩软件吧

佩服,一个善于思考的头脑

如果你的职业是教师,估计是个不错的老师。

一看就是知道菜鸟,MVC模式怎么是三层结构呢.MVC是和种思想.

刘 说:

一看就是知道菜鸟,MVC模式怎么是三层结构呢.MVC是和种思想.

MVC不是三层是几层?
“思想”--你是那些没有什么技术只有理论的大学老师吧?很鄙视你们这种人,只会说这个是个思想,那个是个思想,到头来什么鸟东西也不会编,最近接了个活,是一所很有名的大学的老师们写的码,给他们反向工程和查BUG(刚毕业没多久什么活都揽),看了一眼是c++的东西,一细看,写得那个垃圾,系统设计得相当的烂,核心功能全在一个类里8000行代码.....还是教授写的?垃圾。码的其它问题都不好意思给他指出来。

人家是本科的,把mvc弄成这样不错了!!

再次鄙视那些个没有本事,很多知识都靠我们自学了四年的大学老师

其他见解 说:

对一个模式的理解只是到这的话,学面向对象的第一课的同学就可以做到了,楼主不过只是玩玩软件吧

你对模式理解很全面吗,在项目里能用得好吗?还是只会理论理论而已啊~~
那这些话题和一个文科生讨论,你的实力也太菜了吧~

我觉得对一个非计算机专业的人来说,写得不错。LZ继续努力。

引用刘的发言:

一看就是知道菜鸟,MVC模式怎么是三层结构呢.MVC是和种思想.

喷子果然无处不在

虽然我还是第一次了解这个模式,但是我觉的这篇文章对我的启发很大,我也觉得很有道理,其实,那些说别人垃圾的,或者说别人是菜鸟的,我想你应该说的更具体点,把证据摆出来,何必逞口舌只能。谢谢楼主!!!

引用tinner的发言:

喷子果然无处不在


虽然无处不在,但他说的是正确的,呵呵,人要学会改正错误!

人家说的很好啊。看的我这个专业生都汗颜.

典型的面向对象思想...着实不错...

你所说的是一种分层的思想.. 这是不错地...

但是你的那些MVC例子 感觉有点牵强..

呵呵,真理就是简单,应用才是王道。能够分析出真样的道理,给你赞赏!

我是个程序员。赞赏楼主的理解和解说能力,教初学者生会很有用。有些人自以为自己是个程序员,对程序了解多一点,就自以为很牛,不要以为自己就比非计算机人就对程序设计模式更有发言权,说别人理解不行。程序中的设计模式也是借鉴现实生活中的思想而来的,比如建筑工程学。计算机比现实生活中的某些东西出来晚多了。
有些人就是容易冲动和激动。稍微发点言,不顺自己的意,或者自己嫉妒啊,心里不爽就忍不住言辞激动了。

支持楼主。我觉得,将复杂的事情简单化,复杂深奥的东西简单化,那才叫真本事。
毛泽东是个文科生,兵法理论没学多少。他的大战思想好多都是从水浒传学来的。

其实我觉得,回帖者都没有提到到楼主给我们带来的最经典的东西,也散发lz真正的文科生的魅力......我在阅读全文的时候,始终让我震聋发聩的是lz文章中的三个字:
方法论

这便是管理大师与工程大师的不同,
我问那么多程序员,你们编程序之前或在做一件事之前,会考虑"方法论"吗?
古语,磨斧不误砍柴功,其实就是 方法论
可是,很多本科的程序员,我招他进来帮我做软件,小程序他会很多,系统 他根本没概念,不知道怎么学的?
一位20年前学软件的学生,现在自己做老板.

真正优秀的程序员一定是个极富思想的人。因为最终的程序表达是对事物的看法。

智商测的都是人对规律的把握,对不同的处理。从这个意义上说,只要人聪明,无论学文科还是理科工科,无非就是举一反三的学习能力。


楼主的文章很好,无论如何,让我这个刚接触此类东西的人受益匪浅,至少我对这有了个大体的认识,谢谢楼主

模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
如此循环 .这是我的看法.

MVC确实只是一种思想,并不一定要严格按照3层设计

软件工程是一个不仅仅只会编程就可以了,涉及到多种知识和学科 ,楼主讲的很好,深入浅出,受益匪浅!

这个我觉得大家讲的都是很有道理的,只是侧重点不同而已罢了

“如果人类社会都是模块化结构”那很可能就是一条通往奴役之路。

我是搜索MVC过来的,还是没给我解决问题,我想问的是:
1.MVC到底是不是三层?
2.如果不是三层,它为什么不是三层?

如果留言的各位大侠有知道的,请email:tsingroo#gmail.com.
起码给一些链接也行。3ks

我很喜欢这种把技术融入生活的文章,谢谢您给我启发~~~

不可否认mvc在课本上确实是一种思想,但也不可否认,mvc在实际工作中就是被应用为三层,我们是要掌握这种思想,但更要重视在实际中的应用,所以楼主用众多的例子来比喻mvc也没有错,关键就是看你是理解还是应用,每个人在实际工作中都会产生自己的理解,我觉得还是以实际工作中的事实来解释比较好。

看看还有点意思,有几个例子有点牵强。其实微软的vs就是最好的例子了:微软开发了几千个功能类,就是所谓的M了,咱们写的数据访问层和业务层都是C,再加个漂亮好用的界面给用户用,就是V了,如此而已。

宽泛的东西,没有任何实质应用;只是把任何接触过MVC并对MVC稍有一定了解的大多数人的想法做了一下总结和发散;

可以用javascript做个MVC的实例来讲解讲解吗?

确实是面向对象思想,控制层调用某个数据层对象方法实现功能并把结果返回到试图层

我只是想简单的理解一下这么模式而已,楼主讲的很形象。。。不喜莫喷

楼主讲的简单明了,比好多说了一大堆专有名词把人绕晕了的强多了。

这和三层架构有区别?
mvc不是这个吧。
模型视图控制

评论挺有意思,从07年到15年,嘿嘿

路过,我只是来看看留言的……

引用日日野晴矢的发言:

我是搜索MVC过来的,还是没给我解决问题,我想问的是:
1.MVC到底是不是三层?
2.如果不是三层,它为什么不是三层?

如果留言的各位大侠有知道的,请email:tsingroo#gmail.com.
起码给一些链接也行。3ks

本来想复习一下 MVC 相关的知识,没想到又点进了阮老师的博客。

这是一篇 2007 年的博客,现在看来还是有一些问题的。MVC 的真正目的是分离关注点,跟软件中的三层架构是不同的概念,阮老师这篇文章里面吧 Model 直接当作“数据层”的说法是错误的,更没有“最上面”和“最下面”的说法,一旦把 MVC 分层了,那这种思考方式就已经错了。

引用oodzchen的发言:

本来想复习一下 MVC 相关的知识,没想到又点进了阮老师的博客。

这是一篇 2007 年的博客,现在看来还是有一些问题的。MVC 的真正目的是分离关注点,跟软件中的三层架构是不同的概念,阮老师这篇文章里面吧 Model 直接当作“数据层”的说法是错误的,更没有“最上面”和“最下面”的说法,一旦把 MVC 分层了,那这种思考方式就已经错了。


应该怎样去正确的理解MVC呢?

通俗易懂,还带联想,点赞!

把文章和留言仔细看完了,真是百家争鸣啊!我也是刚接触QT做一个扫雷的项目,老师推荐用MVC架构来做

w3c有个学习网站这么解释mvc:
MVC 模型通过三个逻辑层来定义 web 应用程序:
business layer(业务层、模型逻辑)
display layer(显示层、视图逻辑)
input control(输入控件、控制器逻辑)
模型(Model)
模型(Model)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象在数据库中存取数据。
View(视图)
View(视图)是应用程序中处理数据显示的部分。
通常从模型数据中创建视图。
控制器
控制器是应用程序中处理用户交互的部分。
通常控制器从视图读取数据、控制用户输入,并向模型发送数据数据。

按照这个说法的话 实际上M相当于逻辑层(或者逻辑+数据层) v和c构成呈现层 数据层其实在这个模型中是比较淡化的

啊啊啊啊,太棒了!!!终于懂了!!!

我觉得楼主说的挺好,至少给大家一个简单的mvc的印象,不过以我原来对mvc粗浅的理解,楼主的这篇文章只能算是入门级的,但是一点都不妨碍引导了很多人入门,还是谢谢楼主,那些有着丰富编程经验的童鞋你们本来就应该来看这篇文章,省点口水吧。

引用x的发言:

w3c有个学习网站这么解释mvc:
MVC 模型通过三个逻辑层来定义 web 应用程序:
business layer(业务层、模型逻辑)
display layer(显示层、视图逻辑)
input control(输入控件、控制器逻辑)
模型(Model)
模型(Model)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象在数据库中存取数据。
View(视图)
View(视图)是应用程序中处理数据显示的部分。
通常从模型数据中创建视图。
控制器
控制器是应用程序中处理用户交互的部分。
通常控制器从视图读取数据、控制用户输入,并向模型发送数据数据。

按照这个说法的话 实际上M相当于逻辑层(或者逻辑+数据层) v和c构成呈现层 数据层其实在这个模型中是比较淡化的

总的来说,Model层负责具体的业务逻辑处理,View最简单即显示层,而Controller作为控制器本质上是一个交互接口即管理数据的输入和输出,若形而下地分析,以MVC web为例,给用户显示信息的网页是View层,但是丰富的web网页需要与用户交互即接收用户的请求、处理请求、返回响应,即C/S结构下的HTTP请求,在这个过程里负责处理请求的这一块属于Model层,剩下的接收用户请求、返回响应就属于Controller了的。

View是显示层,而Controller并不呈现,因为View层不仅仅是显示信息,同时也为用户提供了一些交互的接口,这些接口是同时属于View层与Controller的。
此外,在服务器端,有接收请求的入口,也有返回响应的出口,在服务器端,Controller是和Model层完全对接的,但这些服务器端的“接口”是逻辑形式的,并非像前端那样可视化,但这些“接口”也是同时属于Controller和Model层的。

所以你的关于View层和Controller是同属显示层的说法只是片面的。而对于Model层而言,数据只是逻辑模型或者说程序的处理对象,这一点我的看法与你相同。

这篇文章简明扼要,适合初学者理解MVC是干什么的,有的书上写了一大堆,最后看了半天什么都不懂,就记住了一大堆名词,我都不知道这个能干什么用,告诉我一堆名词干什么。就跟吃饭,非要说成人摄入负熵维持耗散体系,谁他么一开始懂这是干什么的。

可以大体上了解到MVC大致是什么东西。
我之前总结了一篇PHP MVC架构入门的文章,和博主类似,以PHP为主

解释的很好,很容易理解,赞一个!

Model: data models, will be converted into DAO and persisted into database(persistence layer), or render the view in the frontend;

View: the presentation layer, receives/displays model data and sends user's http requests to the controller;

Controller: the controller layer, integrating frontend and backend data, will call relevant services or operate model data via DAO layer and ORM.

深入点还可以看看这篇MVP模式与MVC模式 --宏宇.

引用oodzchen的发言:

本来想复习一下 MVC 相关的知识,没想到又点进了阮老师的博客。

这是一篇 2007 年的博客,现在看来还是有一些问题的。MVC 的真正目的是分离关注点,跟软件中的三层架构是不同的概念,阮老师这篇文章里面吧 Model 直接当作“数据层”的说法是错误的,更没有“最上面”和“最下面”的说法,一旦把 MVC 分层了,那这种思考方式就已经错了。


为啥总有人说别人是错的,就是不把正确的说出来让我们不知道的学学呢?

引用lijipei的发言:


虽然无处不在,但他说的是正确的,呵呵,人要学会改正错误!


两个理解我都觉得没有错误,只是觉得言语不需要太过于偏激。

计算器小程序的举例,有些奇怪,和我理解的不一样,我再研究一哈

MVC 和三层架构真的不是一个东西 ,你想错 了

引用oliver的发言:

“如果人类社会都是模块化结构”那很可能就是一条通往奴役之路。

管理者的定位是服务,则是公仆;定位是领导,则是奴隶主

公司就是新的国家。

首先mvc不是是三层模型,三层模型是逻辑层依赖数据层,视图层依赖逻辑层,虽然分割了功能,但本质上是强耦合设计,mvc正是为了解藕这种强耦合设计而提出的,mvc的根在m,m即负责信息的表示,也负责信息的处理,这也符合实际情况,即逻辑是依赖数据的,数据结构发生变化则逻辑肯定也要变化,所以统一由m负责,v依赖model但事实上m对v的依赖只是依赖m中数据结构这一部分,和m的逻辑功能无关,v通过自己的理解来输出表现内容,这样model的数据结构成了m与v之间的接口,从而解藕了v中的表现与对m中的逻辑的依赖,最后是c,c启动粘合的作用,将v中的反馈传递到m的逻辑部分,激发逻辑运行,同时监听m中的数据变化,激发v的表现更新,所以为了进一步的解藕出现了,领域模型和视图模型的概念,将m与v的数据结构依赖变为数据结构转换。

简单的觉得不够深入,深入的看不懂,哈哈

今天刚刚解接触了MVC分层架构
我接下来的项目搭建应该去参考这种设计。
好好的研究!~~

谁能想到 这是一篇十几年前学的文章 到2020了,还有人在看 。 了不起

写的挺好,通俗易懂,说本文不深刻的直接维基百科不就行了吗……文章有浅显的有深刻的,面对的人群也不一样呀!

通俗易懂,不枯燥,支持!!

谁能想到阮一峰以前的文章也被喷过

@匿名:

说的对,能让人看懂理解的才是恰到好处,楼主写的对于初学者确实很有帮助

这篇文章讲的mvc是我见过最简洁的:就是一个分层思想,mvc不过是把这一思想用到了面向用户的程序(有视图)设计中。

引用IQ75的发言:

……
不愧是文科生,真能联想,看得俺这个写代码的一脑门汗。

13年过去了,技术日新月异,不断有优秀的设计思想 降低了数据复杂度

来个一锤定音。@2333
1.虽然看了半天也不知道在争论什么,但是感觉楼主讲的没什么大问题的
2.针对强耦合和分层思想,底层基础解决的内容是一样的,所以大概可以定义为mvc是针对强耦合的进步
3.mvc,直接说成三层或者多层,个人认为多数是三层,多层抽象那明显也可以其他字母命名表示的,问题不大。
4.分层思想大概就是多个模块降低关联,通过一定的接口简单定义,哪个模块被替换了新的模块(更强的)也不影响,和mvc楼主说的分成三层,model,view,control多数简单理解非常清晰。
5.看下时间是2007年,对别人不过分苛刻,与人为善,有自己的理解,写下来,供别人参考即可。

来考古了

前端在mvc项目中沦为切图仔

感慨时间飞逝,感慨大神就是大神。微言大义。

现在的DAO就相当于替换了M,中心化变成了去中心化,V不变,C微调,提高社会效率,未来趋势。

上课听不懂设计模式 今日观大神一言 如耳目顿聪

引用刘的发言:

一看就是知道菜鸟,MVC模式怎么是三层结构呢.MVC是和种思想.

15年过去了,到底谁是菜鸟

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接