标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?
当前回答
在web开发中,MVC是服务器端,MVVM是客户端(浏览器)。
大多数情况下,浏览器中的MVVM使用javascript。mvc有很多服务器端技术。
其他回答
让我惊讶的是,这是一个投票很高的答案,却没有提到MVVM的起源。MVVM是微软社区常用的术语,它起源于Martin Fowler的表示模型。所以要了解这个模式的动机以及与他人的不同之处,首先要阅读关于这个模式的原文。
微软在这里提供了Windows环境中MVVM模式的解释。
这里有一个关键的部分:
在模型-视图-视图模型设计模式中,应用程序由以下部分组成 三个一般组成部分。 模型:这表示应用程序使用的数据模型。例如,在图片共享应用程序中,此层可能表示 设备上可用的图片集和用于读取和的API 写入图片库。 视图:应用通常由多个UI页面组成。显示给用户的每个页面都是MVVM术语中的一个视图。观点是 用于定义和设置用户所看到内容样式的XAML代码。的数据 从模型显示到用户,这是工作的 的当前状态为UI提供此数据 例如,在一个图片共享应用中,视图就是UI 向用户显示设备上的相册列表,其中的图片 一个相册,或者另一个向用户显示特定信息的相册 图片。 ViewModel: ViewModel将数据模型或简单的模型绑定到应用程序的UI或视图上 哪一个来管理模型中的数据并将数据作为一个集合公开 XAML UI或视图可以绑定到的属性。例如, 在图片共享应用中,ViewModel会显示一个相册列表, 并且为每个相册公开一个图片列表。UI是不可知论的 图片从何而来,如何获取。它只是 知道ViewModel所显示的一组图片,并显示它们 对用户。
在MVVM中,控制器不会被ViewModel取代,因为ViewModel的功能与控制器完全不同。你仍然需要一个控制器,因为如果没有控制器,你的模型、视图模型和视图就做不了什么…在MVVM中你也有一个控制器,MVVM这个名字是错误的。
在我看来,MVVMC是正确的名字。
正如你所看到的,ViewModel只是MVC模式的一个附加。它将转换逻辑(例如将对象转换为字符串)从控制器移动到ViewModel。
一般来说,MVC用于Web开发,MVVM在WPF/Silverlight开发中最受欢迎。 然而,有时web架构可能混合使用MVC和MVVM。
例如:你可能会使用knockout.js,在这种情况下,你的客户端上会有MVVM。 你的MVC的服务器端也可以改变。在复杂的应用程序中,没有人使用纯模型。使用ViewModel作为MVC的“模型”可能有一定的意义,而你真正的模型基本上将是这个VM的一部分。这为您提供了一个额外的抽象层。
我认为要理解这些首字母缩略词的意思,最简单的方法就是暂时忘掉它们。相反,想想它们源自的软件,每一个软件。这实际上可以归结为早期网络和桌面之间的区别。
在2000年代中期,随着复杂性的增长,MVC软件设计模式(在20世纪70年代首次被描述)开始应用于web应用程序。想想数据库、HTML页面和中间的代码。让我们稍微改进一下以达到MVC:对于»database«,让我们假设数据库加接口代码。对于»HTML页面«,让我们假设HTML模板加上模板处理代码。对于»code inbetween«,让我们假设代码将用户单击映射到操作,可能会影响数据库,肯定会显示另一个视图。就是这样,至少为了比较的目的是这样的。
让我们保留这个网页的一个特性,不是像今天那样,而是像十年前那样,当时JavaScript还是一个低级的、卑鄙的烦恼,真正的程序员很好地避开了:HTML页面本质上是愚蠢和被动的。浏览器是一个瘦客户机,或者可以说是一个穷客户机。浏览器中没有智能。整页重载规则。每次都会重新生成»view«。
让我们记住,尽管这种网络方式风靡一时,但与桌面相比,它是非常落后的。桌面应用程序是胖客户端,也可以说是富客户端。(甚至像Microsoft Word这样的程序也可以被视为某种客户端,文档客户端。)他们是充满智慧的客户,对自己的数据了如指掌。他们是有状态的。它们在内存中缓存正在处理的数据。没有整页重载这种废话。
这种富桌面方式可能就是第二个首字母缩写MVVM的起源。不要被字母所迷惑,也不要被c的省略所迷惑。他们必须如此。没有东西被移除。我们只增加了一件事:状态性,缓存在客户端上的数据(以及处理这些数据的智能)。该数据(本质上是客户机上的缓存)现在被称为»ViewModel«。它允许丰富的交互性。就是这样。
MVC =模型、控制器、视图=本质上的单向通信=交互性差 MVVM =模型、控制器、缓存、视图=双向通信=丰富的交互性
我们可以看到,通过Flash、Silverlight,以及最重要的JavaScript, web已经拥抱了MVVM。浏览器不能再被合法地称为瘦客户机。看看它们的可编程性。看看他们的内存消耗。看看现代网页上所有的Javascript交互。
就我个人而言,我发现这个理论和缩略语业务更容易理解,看看它在具体现实中指的是什么。抽象的概念是有用的,特别是在具体的问题上,所以理解可能会有一个完整的循环。