虽然网上有很多文章讲解MVVM模式原理及实现,但是毕竟拾人牙慧,学习消化后用自己的语言表达出来才会更深刻的理解。
1.MVVM模式的由来
1.1.关联知识
在谈起MVVM模式时,总会有相关的话题被提起,那就是MVC模式和MVP模式。
正如图中和字面意思表示的,MVC、MVP、MVVM这三种设计模式相互联系又有所区分。
相同的是,三者都具有M(Model)和V(View)两部分。其中:
- View:负责数据可视化的呈现和用户交互,通俗讲就是展示的视图界面。
- Model:业务逻辑和数据的提供者,在面向对象语言中往往是数据实体模型的获取及处理等,一般靠近数据库。
不同的是,三者采用了不同的形式来将Model和View连接起来。只有真正搞清楚了每一层用途,才能理解模式的原理。
1.2.PM模式
除了MVC和MVP模式,还有一种比较相似的PM(Presentation Model)模式。PM模式也可以看作是MVPM模式,和MVC、MVP相同的仍然是Model和View。在.NET开发,如WPF和Sliverlight中常用的MVVM模式就是由PM模式演变而来的,所以了解PM模式更有助于理解MVVM模式。
PM模式可以看作是一个界面状态保存器,也就是将View中的行为和状态放置在一个类中,不包含任何显示控件,也不依赖于任何的UI框架,这个类就被称为Presentation Model。
一般而言,每个View至少有一个对应的Presentation Model,对于View中的一些状态,在Presentation Model中都有对应的值来保存,它的任务就是根据相应逻辑改变对应状态值,而将状态值在View和Presentation Model中同步就是使用同步机制来完成的。
另外值得注意的是在PM模式中,View和Presentation Model之间的同步是用观察者模式实现的,具体是通过.NET中的数据绑定机制实现的。这也就导致了PM知道Model,不知道View;View通过数据绑定知道PM,但不了解其内部细节。
由于在.NET平台的WPF/Sliverlight中,同步机制也即数据绑定机制更加强大,PM模式逐渐演变成了MVVM模式。
2.MVVM模式详解
同PM模式相比,MVVM模式将Presentation Model改成了ViewModel层。其中ViewModel可以看作是抽象的View,包含了所有的UI逻辑和业务对象类的引用,充分利用Commands(命令)和Behaviors(行为)机制搭建起View和Model之间的桥梁。
其实抛开编程语言和开发平台来讲,MVVM模式的目的都是分层,让界面和逻辑分离,也是让项目开发中的UI设计人员和代码开发人员各司其职、互不依赖。那么只要解决好核心的ViewModel层的问题,其他的自然不再话下。对于MVVM模式而言,其核心原则就是:
无论发生任何外部变化,仅操作 ViewModel 中的数据