标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?
当前回答
MVVM是表示模型模式的改进(有争议)。我说有争议,因为唯一的区别是WPF如何提供数据绑定和命令处理的能力。
其他回答
在MVVM中,控制器不会被ViewModel取代,因为ViewModel的功能与控制器完全不同。你仍然需要一个控制器,因为如果没有控制器,你的模型、视图模型和视图就做不了什么…在MVVM中你也有一个控制器,MVVM这个名字是错误的。
在我看来,MVVMC是正确的名字。
正如你所看到的,ViewModel只是MVC模式的一个附加。它将转换逻辑(例如将对象转换为字符串)从控制器移动到ViewModel。
首先,MVVM是使用XAML处理显示的MVC模式的发展。本文概述了这两者的一些方面。
模型/视图/视图模型架构的主要目的似乎是在数据(“模型”)之上,还有另一层非可视组件(“视图模型”),它将数据的概念更紧密地映射到数据的视图(“视图”)的概念。视图绑定的是ViewModel,而不是直接绑定模型。
微软在这里提供了Windows环境中MVVM模式的解释。
这里有一个关键的部分:
在模型-视图-视图模型设计模式中,应用程序由以下部分组成 三个一般组成部分。 模型:这表示应用程序使用的数据模型。例如,在图片共享应用程序中,此层可能表示 设备上可用的图片集和用于读取和的API 写入图片库。 视图:应用通常由多个UI页面组成。显示给用户的每个页面都是MVVM术语中的一个视图。观点是 用于定义和设置用户所看到内容样式的XAML代码。的数据 从模型显示到用户,这是工作的 的当前状态为UI提供此数据 例如,在一个图片共享应用中,视图就是UI 向用户显示设备上的相册列表,其中的图片 一个相册,或者另一个向用户显示特定信息的相册 图片。 ViewModel: ViewModel将数据模型或简单的模型绑定到应用程序的UI或视图上 哪一个来管理模型中的数据并将数据作为一个集合公开 XAML UI或视图可以绑定到的属性。例如, 在图片共享应用中,ViewModel会显示一个相册列表, 并且为每个相册公开一个图片列表。UI是不可知论的 图片从何而来,如何获取。它只是 知道ViewModel所显示的一组图片,并显示它们 对用户。
对于不太熟悉架构模式主题的人来说,其他答案可能不太容易理解。对应用程序架构不熟悉的人可能想知道它的选择在实践中如何影响她的应用程序,以及在社区中有什么大惊小怪的。
为了更好地解释上述问题,我编写了这个涉及MVVM、MVP和MVC的剧本。故事开始于一个用户点击电影搜索应用程序中的“FIND”按钮…
用户:单击…
观点:那是谁?[MVVM|MVP|MVC]
用户:我只是点击了搜索按钮……
视图:好的,稍等... .(MVVM MVP | | MVC)
(视图调用ViewModel|Presenter|Controller…)
视图:嘿,ViewModel|Presenter|Controller,一个用户刚刚点击了搜索按钮,我该怎么做?(MVVM MVP | | MVC)
ViewModel|Presenter|Controller:嘿View,这个页面上有搜索词吗?(MVVM MVP | | MVC)
查看:是的,…在这里…" piano " [MVVM|MVP|MVC]
这是MVVM和MVP|MVC之间最重要的区别
演示者|控制器:谢谢视图,…同时我正在模型上查找搜索词,请给他/她一个进度条[MVP|MVC]
(演示者|控制器正在调用模型…)
ViewModel:谢谢,我会在模型上查找搜索词,但不会直接更新你。相反,如果有任何结果,我将触发事件来searchResultsListObservable。所以你最好仔细观察一下。(MVVM)
(当在searchResultsListObservable中观察任何触发器时,视图认为它应该向用户显示一些进度条,因为ViewModel不会在那上面与它对话)
——————————————————————————————
ViewModel|演示者|控制器:嘿,模型,你有匹配这个搜索词吗?: " piano " [MVVM|MVP|MVC]
Model: Hey ViewModel|Presenter|Controller, let me check…[MVVM|MVP|MVC]
(模型正在向电影数据库查询…)[MVVM|MVP|MVC]
(过了一会儿……)
————这是MVVM, MVP和MVC————-之间的分歧点
模型:我为你找到了一个列表,ViewModel|Presenter,这里是JSON“[{" name ": "钢琴老师","年份":2001},{" name ": "钢琴","年份":1993}]" [MVVM|MVP]
模型:有一些结果可用,控制器。我已经在我的实例中创建了一个字段变量,并将其填充为结果。它的名字是searchResultsList [MVC]
(演示者|控制器感谢模型并返回视图)[MVP|MVC]
主持人:感谢您的等待,View,我为您找到了匹配结果的列表,并将它们以像样的格式排列:["钢琴老师2001″,"钢琴1993 "]。同时,现在请隐藏进度条[MVP]
控制器:感谢等待视图,我已经询问了模型关于你的搜索查询。它说它已经找到了一个匹配结果列表,并将它们存储在其实例内名为“searchResultsList”的变量中。你可以从那里得到它。同时,现在请隐藏进度条[MVC]
ViewModel: searchResultsListObservable上的任何观察者都将被通知有这样一个像样格式的新列表:[" Piano Teacher 2001″," Piano 1993 "]。
视图:非常感谢主讲人[MVP]
视图:谢谢你“控制器”[MVC](现在视图在问自己:我应该如何将我从模型得到的结果呈现给用户?电影的制作年份是先写还是后写?)
视图:哦,在searchResultsListObservable中有一个新的触发器…,很好,有一个像样的列表,现在我只需要在列表中显示它。有了结果之后,我还应该隐藏进度条。(MVVM)
如果你感兴趣,我在这里写了一系列文章,通过实现一个电影搜索android应用程序来比较MVVM、MVP和MVC。
简单的区别:(灵感来自Yaakov的Coursera AngularJS课程)
MVC(模型-视图-控制器)
模型:模型包含数据信息。不调用或使用控制器和视图。包含业务逻辑和表示数据的方法。其中一些数据可能以某种形式显示在视图中。它还可以包含从某些源检索数据的逻辑。 控制器:作为视图和模型之间的连接。视图调用控制器,控制器调用模型。它基本上通知模型和/或视图进行适当的更改。 视图:处理UI部分。与用户交互。
模型视图视图模型
ViewModel:
它是视图状态的表示。 它保存在视图中显示的数据。 响应视图事件,也就是表示逻辑。 为业务逻辑处理调用其他功能。 永远不要直接要求视图显示任何东西。