标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?
当前回答
微软在这里提供了Windows环境中MVVM模式的解释。
这里有一个关键的部分:
在模型-视图-视图模型设计模式中,应用程序由以下部分组成 三个一般组成部分。 模型:这表示应用程序使用的数据模型。例如,在图片共享应用程序中,此层可能表示 设备上可用的图片集和用于读取和的API 写入图片库。 视图:应用通常由多个UI页面组成。显示给用户的每个页面都是MVVM术语中的一个视图。观点是 用于定义和设置用户所看到内容样式的XAML代码。的数据 从模型显示到用户,这是工作的 的当前状态为UI提供此数据 例如,在一个图片共享应用中,视图就是UI 向用户显示设备上的相册列表,其中的图片 一个相册,或者另一个向用户显示特定信息的相册 图片。 ViewModel: ViewModel将数据模型或简单的模型绑定到应用程序的UI或视图上 哪一个来管理模型中的数据并将数据作为一个集合公开 XAML UI或视图可以绑定到的属性。例如, 在图片共享应用中,ViewModel会显示一个相册列表, 并且为每个相册公开一个图片列表。UI是不可知论的 图片从何而来,如何获取。它只是 知道ViewModel所显示的一组图片,并显示它们 对用户。
其他回答
MVVM
视图➡视图模型➡模型
视图有对ViewModel的引用,反之则没有。 ViewModel有对模型的引用,反之则没有。 视图没有对模型的引用,反之亦然。
如果你正在使用一个控制器,它可以有一个视图和视图模型的引用,尽管控制器并不总是必要的,就像在SwiftUI中演示的那样。 数据绑定:我们为ViewModel属性创建侦听器,这样数据就可以通过视图模型从视图流向模型。虽然这些引用是单向的:View↔ViewModel↔Model,但数据需要流动:View↔ViewModel。视图如何通过读取自己的属性从模型中获取数据是很清楚的。数据绑定是如何在视图中检测事件并将它们反馈给模型。
class CustomView: UIView {
var viewModel = MyViewModel {
didSet {
self.color = viewModel.viewColor
}
}
convenience init(viewModel: MyViewModel) {
self.viewModel = viewModel
}
}
struct MyViewModel {
var viewColor: UIColor {
didSet {
colorChanged?() // This is where the binding magic happens.
}
}
var colorChanged: ((UIColor) -> Void)?
}
class MyViewController: UIViewController {
let myViewModel = MyViewModel(viewColor: .green)
let customView: CustomView!
override func viewDidLoad() {
super.viewDidLoad()
// This is where the binder is assigned.
myViewModel.colorChanged = { [weak self] color in
print("wow the color changed")
}
customView = CustomView(viewModel: myViewModel)
self.view = customView
}
}
设置的差异
业务逻辑保存在MVC的控制器中,MVVM的ViewModels中。 在MVC中,事件直接从视图传递到控制器,而在MVVM中,事件从视图传递到ViewModel再到控制器(如果有的话)。
共同的特征
MVVM和MVC都不允许视图直接向模型发送消息。 两者都有自己的模型。 两人都有自己的观点。
MVVM的优点
因为viewmodel包含业务逻辑,所以它们是更小的具体对象,便于进行单元测试。另一方面,在MVC中,业务逻辑在ViewController中。如果不同时测试所有的方法和侦听器,你怎么能相信视图控制器的单元测试是全面安全的呢?您不能完全相信单元测试结果。 在MVVM中,由于业务逻辑从控制器中被抽取到原子ViewModel单元中,ViewController的大小缩小了,这使得ViewController代码更加清晰。
MVC的优点
在控制器中提供业务逻辑减少了对分支的需求,因此语句更有可能在缓存上运行,这比将业务逻辑封装到ViewModels中性能更好。 在一个地方提供业务逻辑可以加速不需要测试的简单应用程序的开发过程。我不知道什么时候不需要检查。 对于新开发人员来说,在ViewController中提供业务逻辑更容易考虑。
在MVVM中,控制器不会被ViewModel取代,因为ViewModel的功能与控制器完全不同。你仍然需要一个控制器,因为如果没有控制器,你的模型、视图模型和视图就做不了什么…在MVVM中你也有一个控制器,MVVM这个名字是错误的。
在我看来,MVVMC是正确的名字。
正如你所看到的,ViewModel只是MVC模式的一个附加。它将转换逻辑(例如将对象转换为字符串)从控制器移动到ViewModel。
视图模型是用户界面元素的“抽象”模型。它必须允许您以非可视的方式(例如测试)在视图中执行命令和操作。
如果你使用过MVC,你可能有时会发现创建模型对象来反映视图的状态很有用,例如,显示和隐藏一些编辑对话框等。在这种情况下,您使用的是视图模型。
MVVM模式只是将该实践推广到所有UI元素。
而且这不是微软的模式,WPF / Silverlight数据绑定特别适合使用这种模式。但是没有什么能阻止您使用它与java服务器面,例如。
简而言之,在MVC控制器中,ViewModel知道(控件)视图,而在MVVM中,ViewModel不知道谁使用它。ViewModel将其可观察属性和操作公开给任何可能对使用它感兴趣的人。这一事实使得测试更容易,因为在ViewModel中没有对UI的引用。
MVVM将视图模型添加到混合中。这很重要,因为它允许您大量使用WPF的绑定方法,而无需将所有特定于UI的部分放在常规模型中。
我可能是错的,但是我不确定MVVM真的强迫控制器混合。我发现这个概念更符合:http://martinfowler.com/eaaDev/PresentationModel.html。我认为人们选择将其与MVC结合起来,而不是将其内置到模式中。
推荐文章
- [Vue警告]:找不到元素
- 模板方法和策略模式之间的区别是什么?
- MVC中的业务逻辑
- 将WPF组合框绑定到自定义列表
- 如何在Kotlin中实现生成器模式?
- 工厂模式和策略模式之间的区别是什么?
- 如何向一个5岁的孩子解释依赖注入?
- 我怎么知道什么时候创建一个接口?
- 在PHP5中创建单例设计模式
- 什么时候我们应该使用观察者和可观察对象?
- 在哪里放置AutoMapper.CreateMaps?
- 使用Enum实现单例(Java)
- 由Jon Skeet撰写的《Singleton》澄清
- 为什么c#不提供c++风格的'friend'关键字?
- Java / Jakarta EE web开发,我从哪里开始,我需要什么技能?