MVC 溯源

转载 2015年11月18日 17:22:37

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
原文地址

相关文章推荐

农产品溯源设计

  • 2017-08-31 15:24
  • 2.39MB
  • 下载

[区块链应用]区块链技术在商品溯源流通领域的应用

区块链技术在商品溯源流通领域的应用 江苏华信区块链 高级研究员 刘峰去年伊始,区块链的概念开始逐渐被世人所熟知。虽然其催化因素是多方面的,不论是越来越高的比特币...
  • lsttoy
  • lsttoy
  • 2017-04-13 09:09
  • 2755

商品RFID/NFC防伪溯源方案

  • 2015-11-19 09:43
  • 2.52MB
  • 下载

脑电溯源定位

头皮记录的脑电是大脑中很多源在记录点叠加起来的结果,而且,这些源的方向(一般随着皮层的褶皱而变化)对最后测量出来的头皮脑电有很大影响。所以不能简单的把头皮对应的激活位置映射到皮层上去,那就只有借助于溯...

C#基于wince的活鸡溯源系统

  • 2009-07-10 10:13
  • 1.39MB
  • 下载

HDFS追本溯源:HDFS操作的逻辑流程与源码解析

本文主要介绍5个典型的HDFS流程,这些流程充分体现了HDFS实体间IPC接口和stream接口之间的配合。 1. Client和NN       Client到NN有大量的元数据操作,比如修...

二维码溯源解决方案

  • 2014-05-06 21:55
  • 1003KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)