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


当前回答

简单的区别:(灵感来自Yaakov的Coursera AngularJS课程)

MVC(模型-视图-控制器)

模型:模型包含数据信息。不调用或使用控制器和视图。包含业务逻辑和表示数据的方法。其中一些数据可能以某种形式显示在视图中。它还可以包含从某些源检索数据的逻辑。 控制器:作为视图和模型之间的连接。视图调用控制器,控制器调用模型。它基本上通知模型和/或视图进行适当的更改。 视图:处理UI部分。与用户交互。

模型视图视图模型

ViewModel:

它是视图状态的表示。 它保存在视图中显示的数据。 响应视图事件,也就是表示逻辑。 为业务逻辑处理调用其他功能。 永远不要直接要求视图显示任何东西。

其他回答

视图模型是用户界面元素的“抽象”模型。它必须允许您以非可视的方式(例如测试)在视图中执行命令和操作。

如果你使用过MVC,你可能有时会发现创建模型对象来反映视图的状态很有用,例如,显示和隐藏一些编辑对话框等。在这种情况下,您使用的是视图模型。

MVVM模式只是将该实践推广到所有UI元素。

而且这不是微软的模式,WPF / Silverlight数据绑定特别适合使用这种模式。但是没有什么能阻止您使用它与java服务器面,例如。

微软在这里提供了Windows环境中MVVM模式的解释。

这里有一个关键的部分:

在模型-视图-视图模型设计模式中,应用程序由以下部分组成 三个一般组成部分。 模型:这表示应用程序使用的数据模型。例如,在图片共享应用程序中,此层可能表示 设备上可用的图片集和用于读取和的API 写入图片库。 视图:应用通常由多个UI页面组成。显示给用户的每个页面都是MVVM术语中的一个视图。观点是 用于定义和设置用户所看到内容样式的XAML代码。的数据 从模型显示到用户,这是工作的 的当前状态为UI提供此数据 例如,在一个图片共享应用中,视图就是UI 向用户显示设备上的相册列表,其中的图片 一个相册,或者另一个向用户显示特定信息的相册 图片。 ViewModel: ViewModel将数据模型或简单的模型绑定到应用程序的UI或视图上 哪一个来管理模型中的数据并将数据作为一个集合公开 XAML UI或视图可以绑定到的属性。例如, 在图片共享应用中,ViewModel会显示一个相册列表, 并且为每个相册公开一个图片列表。UI是不可知论的 图片从何而来,如何获取。它只是 知道ViewModel所显示的一组图片,并显示它们 对用户。

我曾经认为MVC和MVVM是一样的。现在,由于Flux的存在,我可以分辨出其中的区别:

在MVC中,对于你应用中的每个视图,你都有一个模型和一个控制器,我称之为视图,视图模型,视图控制器。该模式并没有告诉您一个视图如何与另一个视图通信。因此,在不同的框架中有不同的实现。例如,在某些实现中,控制器之间相互通信,而在其他实现中,有另一个组件在它们之间进行中介。甚至还有视图模型相互通信的实现,这打破了MVC模式,因为视图模型应该只由视图控制器访问。

在MVVM中,每个组件都有一个视图模型。该模式没有指定视图应该如何影响视图模型,所以通常大多数框架只在视图模型中包含控制器的功能。但是,MVVM确实告诉您,视图模型的数据应该来自模型,这是整个模型,它不知道或自定义特定的视图。

为了说明差异,让我们以Flux模式为例。Flux模式告诉我们应用中的不同视图应该如何通信。每个视图侦听一个存储,并使用分派器触发操作。分派程序依次将刚刚执行的操作告知所有存储,然后存储更新自己。Flux中的存储对应于MVVM中的(通用)模型。它不是针对任何特定视图定制的。所以通常当人们使用React和Flux时,每个React组件实际上都实现了MVVM模式。当一个动作发生时,视图模型调用分派器,最后它根据存储(即模型)中的变化得到更新。你不能说每个组件都实现了MVC,因为在MVC中只有控制器才能更新视图模型。因此MVVM可以和Flux一起工作(MVVM处理视图和视图模型之间的通信,Flux处理不同视图之间的通信),而MVC不能在不破坏关键原则的情况下与Flux一起工作。

一般来说,MVC用于Web开发,MVVM在WPF/Silverlight开发中最受欢迎。 然而,有时web架构可能混合使用MVC和MVVM。

例如:你可能会使用knockout.js,在这种情况下,你的客户端上会有MVVM。 你的MVC的服务器端也可以改变。在复杂的应用程序中,没有人使用纯模型。使用ViewModel作为MVC的“模型”可能有一定的意义,而你真正的模型基本上将是这个VM的一部分。这为您提供了一个额外的抽象层。

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