标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?


当前回答

首先,MVVM是使用XAML处理显示的MVC模式的发展。本文概述了这两者的一些方面。

模型/视图/视图模型架构的主要目的似乎是在数据(“模型”)之上,还有另一层非可视组件(“视图模型”),它将数据的概念更紧密地映射到数据的视图(“视图”)的概念。视图绑定的是ViewModel,而不是直接绑定模型。

其他回答

我认为要理解这些首字母缩略词的意思,最简单的方法就是暂时忘掉它们。相反,想想它们源自的软件,每一个软件。这实际上可以归结为早期网络和桌面之间的区别。

在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交互。

就我个人而言,我发现这个理论和缩略语业务更容易理解,看看它在具体现实中指的是什么。抽象的概念是有用的,特别是在具体的问题上,所以理解可能会有一个完整的循环。

 

据我所知,MVVM映射到MVC的MV——也就是说,在传统的MVC模式V不沟通直接与M .第二版本的MVC,之间有一个直接联系M和诉MVVM似乎把所有任务相关的M和V交流,和夫妻分离它的c .实际上,还有大范围应用程序工作流程(或实现的使用场景)中没有完全占MVVM。这就是控制器的作用。通过从控制器中删除这些较低级别的方面,它们更干净,更容易修改应用程序的使用场景和业务逻辑,也使控制器更具可重用性。

首先,MVVM是使用XAML处理显示的MVC模式的发展。本文概述了这两者的一些方面。

模型/视图/视图模型架构的主要目的似乎是在数据(“模型”)之上,还有另一层非可视组件(“视图模型”),它将数据的概念更紧密地映射到数据的视图(“视图”)的概念。视图绑定的是ViewModel,而不是直接绑定模型。

MVVM模型-视图视图模型类似于MVC,模型-视图控制器

控制器被替换为ViewModel。ViewModel位于UI层下面。ViewModel公开视图所需的数据和命令对象。你可以把它想象成一个容器对象视图从它那里获取数据和动作。ViewModel从模型中提取数据。

Russel East写了一篇博客,详细讨论了为什么MVVM不同于MVC

MVVM将视图模型添加到混合中。这很重要,因为它允许您大量使用WPF的绑定方法,而无需将所有特定于UI的部分放在常规模型中。

我可能是错的,但是我不确定MVVM真的强迫控制器混合。我发现这个概念更符合:http://martinfowler.com/eaaDev/PresentationModel.html。我认为人们选择将其与MVC结合起来,而不是将其内置到模式中。