标准“模型视图控制器”模式和Microsoft的Model / View / ViewModel模式之间有区别吗?
#1楼
我认为理解这些首字母缩略词含义的最简单方法是暂时忘记它们。 取而代之的是,考虑一下它们起源的软件。 实际上,可以归结为早期Web和桌面之间的区别。
第一个缩写MVC起源于网络。 (是的,以前可能曾经有过,但是Web才是它如何被广大Web开发人员所采用。)考虑一下数据库,HTML页面和它们之间的代码。 让我们对其进行细化以得出MVC:对于»database«,让我们假设数据库加上接口代码。 对于“ HTML页面”,我们假设HTML模板加上模板处理代码。 对于“之间的代码”,我们假设代码将用户的点击映射到操作,这可能会影响数据库,肯定会导致显示另一个视图。 就是这样,至少出于此比较的目的。
让我们保留此Web东西的一个功能,而不是今天,而是十年前存在的那年,当时JavaScript是一种卑鄙的,令人卑鄙的烦恼,真正的程序员对此很好地避免了:HTML页面本质上是愚蠢而被动的。 浏览器是瘦客户端,或者如果可以的话,是不良客户端。 浏览器中没有智能。 整页重新加载规则。 每次都会重新生成»view«。
让我们记住,尽管风靡一时,但与台式机相比,这种Web方式仍然落后很多。 桌面应用程序可以是胖客户端,也可以是富客户端。 (甚至可以将Microsoft Word之类的程序视为某种类型的客户端,即文档的客户端。)它们是充满智慧,对数据知识丰富的客户端。 他们是有状态的。 他们将正在处理的数据缓存在内存中。 没有像整页重新加载这样的废话。
这种丰富的桌面方式可能就是第二个缩写MVVM的起源。 不要被字母所迷惑,不要被C所迷惑。控制器仍然在那里。 他们必须是。 什么都不会去除。 我们只添加一件事:状态性,缓存在客户端上的数据(以及用于处理该数据的智能)。 该数据实际上是客户端上的缓存,现在称为»ViewModel«。 这就是允许丰富交互性的原因。 就是这样。
- MVC =模型,控制器,视图=本质上是单向通信=交互性较差
- MVVM =模型,控制器,缓存,视图=双向通信=丰富的交互性
我们可以看到,借助Flash,Silverlight和最重要的JavaScript,Web已包含了MVVM。 浏览器不再可以合法地称为瘦客户端。 看他们的可编程性。 看他们的内存消耗。 查看现代网页上的所有Javascript交互性。
我个人认为,通过查看具体现实中所指的内容,可以更轻松地理解该理论和首字母缩写词业务。 抽象的概念很有用,尤其是在具体问题上进行演示时,这样的理解可能会绕一圈。
#2楼
Microsoft 在此处提供了Windows环境中MVVM模式的说明 。
这是关键部分:
在Model-View-ViewModel设计模式中,一个应用程序由三个常规组件组成。
![]()
模型 :这表示您的应用程序使用的数据模型。 例如,在图片共享应用中,此层可能代表设备上可用的图片集以及用于读取和写入图片库的API。
视图 :一个应用程序通常由多个页面的UI组成。 向用户显示的每个页面都是MVVM术语中的一个视图。 视图是用于定义和设置用户所见内容的XAML代码。 来自模型的数据会显示给用户,这是ViewModel的工作,它根据应用程序的当前状态向UI提供此数据。 例如,在图片共享应用中,视图将是向用户显示设备上的相册列表,相册中的图片的UI,以及可能向用户显示特定图片的UI。
ViewModel :ViewModel将数据模型(或简称模型)与应用程序的UI或视图相关联。 它包含用于管理模型中数据的逻辑,并将数据公开为XAML UI或视图可以绑定到的一组属性。 例如,在图片共享应用中,ViewModel将公开一个相册列表,而对于每个相册,则公开一个图片列表。 UI不知道图片来自何处以及如何检索图片。 它只是知道ViewModel公开的一组图片并将其显示给用户。
#3楼
好吧,通常MVC用于Web开发,而MVVM在WPF / Silverlight开发中最为流行。 但是,有时Web架构师可能同时使用MVC和MVVM。
例如:您可能使用淘汰表.js ,在这种情况下,您的客户端将具有MVVM。 MVC的服务器端也可以更改。 在复杂的应用程序中,没有人使用纯模型。 可以将ViewModel用作MVC的“模型”,并且实际的Model基本上将成为此VM的一部分。 这为您提供了额外的抽象层。
#4楼
viewmodel是用户界面元素的“抽象”模型。 它必须允许您以非可视的方式执行命令和视图中的操作(例如,对其进行测试)。
如果您使用过MVC,则可能有时发现创建模型对象以反映视图状态非常有用,例如,显示和隐藏某些编辑对话框等。在这种情况下,您正在使用viewmodel。
MVVM模式只是该实践对所有UI元素的概括。
而且这不是Microsoft模式,但要补充的是WPF / Silverlight数据绑定特别适合于使用此模式。 但是,例如,没有什么可以阻止您在Java服务器界面上使用它。
#5楼
令我惊讶的是,这是一个高度投票的答案,而没有提及MVVM的起源 。 MVVM是Microsoft社区中流行的术语,它起源于Martin Fowler的Presentation Model 。 因此,要了解模式的动机和与他人的差异,第一篇关于模式的文章是必读的。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3139404