Model–view–viewmodel(MVVM) 是一个软件架构设计模式。
由John Gossman(同样也是WPF和Silverlight的架构师)与2005年在他的博客上发表。
MVVM模式的组成
Model
Model 是指任何一个领域模型(domain model),它代表了真实情况的内容(一个面向对象的方法),或表示内容(以数据为中心的方法)的数据访问层。
View
就像在 MVC 和 MVP 模式下,view 就是用户界面(UI)。
Viewmodel
ViewModel 是一个公开公共属性和命令的抽象的view。取代了 MVC 模式的 controller,或 MVP 模式的任命者(presenter),MVVM 有一个驱动。在 viewmodel 中,这种驱动传达视图和数据绑定的通信。此 viewmodel 已被描述为该 model 中的数据的状态。
Binder机制
MVVM 模式中包含了说明性数据和命令绑定机制。微软的做法中,binder是一种叫 XAML 的标记语言。binder 使得开发人员不需要去编写样板化的代码来同步视图模型和视图。如果在微软解决方案库外执行实施成功了,那么这种数据绑定机制就是促成这个模式得以发展的关键性因素。
基本原理
MVVM 设计中充分利用了 WPF 中数据绑定功能,通过从 view 层消除几乎所有的 GUI 代码(“代码后置”),以更好地促进将视图层从其它模式中分离出来开发。开发人员不再需要具有用户体验才能来编写GUI代码,他们可以用由应用开发人员开发和维护的框架中的标记语言(如 XAML),来创建数据和 viewmodel 绑定。这种角色的分离使得UX设计师专注于UX的需求而不是编程的逻辑。因此应用程序层可在多个工作流开发以提高生产率。即使代码库只有一个开发人员,对 view 和 model 的适当分离都会更有效率,因为用户界面通常变化频繁,而且在开发周期期间,终端用户的反馈时间也会比较迟。
MVVM模式视图在MVC中提供的分离功能开发的优点的基础上,同时利用数据绑定的优点和绑定数据的框架,以求达到一种尽可能接近的纯应用程序模型。它使用了 binder,viewmodel 和任何业务层“数据检查”功能来验证输入的数据。其结果是,model 和框架驱动尽可能多的操作以消除或减少其直接操纵view的应用逻辑(例如,代码后置)。
批评
对 MVVM 模式的批评是来自 MVVM 创建者 John Gossman,他指出,对于简单的用户界面操作,执行 MVVM 的花费“ 过头了”。他还指出,对于较大的应用,推广 viewmodel 变得更加困难。此外,他还说明大型应用项目里数据绑定可以引起相当大的内存消耗。