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

事件溯源(Event Sourcing)

一个对象从创建开始到消亡会经历很多事件,以前我们是在每次对象参与完一个业务动作后把对象的最新状态持久化保存到数据库中,也就是说我们的数据库中的数据是反映了对象的当前最新的状态。而事件溯源则相反,不是保...
  • tenfyguo
  • tenfyguo
  • 2014年05月13日 15:44
  • 1999

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

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

Linux服务器应急事件溯源报告

Author:Inn0team 0x00 目录 关于目标环境的中间进度检测报告一:情况概述 二:取证情况 2.1 目标网络情况 2.2 针对xxx服务器中间件的检测2.3 针对xxx服务...
  • qq_27446553
  • qq_27446553
  • 2016年02月19日 09:09
  • 801

一次溯源过程

记录一下一次溯源的过程:当时某个客户说网站遇到劫持的情况。要求我们来看看,但是由于某些原因,看不到服务器上的内容,只能够获取日志进行溯源。 看到日志是2017-04-01上传文件,然后搜索关键字u...
  • ZZZJX7
  • ZZZJX7
  • 2017年04月18日 17:51
  • 515

六边形溯源追踪算法编程思想与代码

六边形算法简介 基于浓度梯度的六边形化学源追踪算法是Russell[8]在2003年提出了。该追踪算法的主要思路如下:     While(循环停止条件){       If(        Then...
  • gjh13
  • gjh13
  • 2017年05月18日 10:10
  • 568

京东供应链溯源防伪平台

PPT整理自: “别人在忙挖矿,京东架构师却悄悄用区块链搞了件大事!” http://blog.csdn.net/dev_csdn/article/details/79062081 仅供参考学习...
  • tigerking1017
  • tigerking1017
  • 2018年01月17日 15:51
  • 183

果类蔬菜农产品溯源管理系统源码开发

农产品溯源系统不仅可以满足消费者的知情权,还能提高139公2673众7371对农产品质量安全的信心;也将农产品生产者置于公共监督之下,约束了生产者不依标生产的行为,真正做到了源头控制,有效提高农产品安...
  • cccgl564335
  • cccgl564335
  • 2018年01月10日 15:16
  • 17

深度 | 区块链在天猫国际商品溯源中的应用

原文链接:点击打开链接 摘要: 用区块链给每个跨境进口商品打上“身份证”,让大家买的放心! 本文作者:天猫进出口技术 团队简介:作为阿里巴巴三大重要战略之一的国际化先锋战队,...
  • qq_40954115
  • qq_40954115
  • 2018年01月12日 14:38
  • 754

脑电溯源定位

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

通过服务器日志溯源定位web应用攻击路径

无论是我们使用的个人计算机还是服务器都为我们提供了强大的日志记录功能。例如系统日志,可以为我们记录系统硬件、软件和系统问题的信息,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹...
  • English0523
  • English0523
  • 2017年07月03日 10:33
  • 407
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MVC 溯源
举报原因:
原因补充:

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