关闭

MVC 溯源

标签: mvc
525人阅读 评论(0) 收藏 举报
分类:

MVC是一种软件架构模式,它把软件分成三个部分,Model-View-Controller,MVC模式最早由Trygve Reenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。Model负责逻辑、事物,View负责展示,Controller负责分发指令到View或者Model。但是你真的在写基于MVC的App吗?

在维基百科上对MVC的解释是这样的:


original mvc

一个典型的基于MVC的架构都需要先分出M-V-C三个模块,这点大家都是比较清楚的,但是这三个模块的交互却演变出了各种MVC版本。先看下最正统的实现:

  • Model 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“ Model ”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,从而,View 可以了解在数据 Model 上发生的改变。
  • View 能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册
  • Controller 起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。

这段描述摘自维基 ,对于Controller 的描述是控制程序流程,可以操作View和Model的状态和行为。但是对于Model和View的关系是这样的:View需要在Model上注册,以便监听Model的变化来刷新View。这段说明在MVC的英文解释里并没有体现,但是在查阅大量资料之后发现,中文的描述并没有错误,在MVC的设计中,View是需要注册在Model上实现刷新机制的。这样再看一遍MVC的流程图:


original mvc

通过这种机制的实现,MVC实际上形成了一个单项的数据流,数据流向:V->C->M->V。这种模式在Android的CursorAdapter实现中是有所体现的,如果把数据插入数据库,那么ListView就会自动刷新页面。然而,在其他地方我们是否都是写MVC的代码呢?

一般我们看到的是这样的一种MVC实现:


mvc on web

在这种模式中View和Model并没有实现监听机制,他们是通过Controller来做中间协调的,真正注册到Model上的是Controller,所有的数据流都是通过Controller的,这种做法实现了View和Model的解耦。在这篇文章中提到,这种模式广泛的应用于 Apple Cocoa 的UI设计(原文讲解的是J2SEApp的设计)。相信这也是真实场景中用的最多的"MVC"。

在Android和iOS出来之前已经有很多基于MVC的Web框架,比如ROR就是一个典型代表,但是ROR的架构实现是这样的:


mvc on ror

这种架构和上面"修改版的MVC" 类似,也不是正统的MVC实现了,实际上在这篇文章中对这种框架的描述是,这是类似于JavaWeb的MVC2(MVC Model2)模式。

在MVC发展的过程中已经产生了太多的分支和变化,咱们在提到MVC这个概念的时候,可能已经不是MVC最初的样子,而他现在又是什么样子,我们写的是哪一种MVC、是不是MVC,作为码农这是需要我们清楚的。而在我们谈论各种框架的MVC实现的时候,也要知道他们其实不是同一个东西。

维基上有句话说的很好:

As with other software patterns, MVC expresses the "core of the solution" to a problem while allowing it to be adapted for each system.[9]
Particular MVC architectures can vary significantly from the traditional description here.

参考:

  1. MVC中文
  2. MVC EN
  3. Java SE Application Design With MVC JavaSE中使用的修改版MVC实现
  4. Getting Started with MVC ROR的MVC实现
  5. JSP model 2 architecture JavaWeb的Model2
原文地址
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:28837次
    • 积分:457
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:68篇
    • 译文:0篇
    • 评论:0条