在介绍MVVM框架以前,先给你们简单介绍一下MVC、MVP框架(因为本博文主要讲解MVVM,因此MVC和MVP将简化介绍,若是须要我将在之后的博文中补充进来)。html
架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不一样需求抽象成为抽象组件,而且可以描述这些抽象组件之间的通讯和调用。设计模式
框架:软件框架是项目软件开发过程当中提取特定领域软件的共性部分造成的体系结构,不一样领域的软件项目有着不一样的框架类型。框架不是现成可用的应用系统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。浏览器
设计模式:是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结,它强调的是一个设计问题的解决方法。架构
相信你们都熟悉这个框架,这个也是初学者最经常使用的框架,该框架虽然也是把代码逻辑和UI层分离,可是View层能作的事情仍是不多的,不少对于页面的呈现仍是交由C实现,这样会致使项目中C的代码臃肿,若是项目小,代码臃肿点仍是能接受的,可是随着项目的不断迭代,代码量的增长,你就会没办法忍受该框架开发的项目,这时MVP框架就应运而生。框架
数据处理流程以下图所示:布局
用户操做浏览器,1.浏览器经过HTTP协议发出数据请求。2.控制器接收请求,经过路径2委托给数据模型,模型经过与逻辑层和持久层的交互,把处理结果反馈给控制器,控制器根据视图结果组装视图,并最终反馈给浏览器能够接受的html数据。单元测试
MVP框架相对于MVC框架作了较大的改变,将Activity当作View使用,代替MVC框架中的C的是P,对比MVC和MVP的模型图能够发现变化最大的是View层和Model层不在直接通讯,全部交互的工做都交由Presenter层来解决。既然二者都经过Presenter来通讯,为了复用和可拓展性,MVP框架基于接口设计的理念你们天然就能够理解其用意。测试
但MVP框架也有不足之处:动画
1.接口过多,必定程度影响了编码效率。编码
2.业务逻辑抽象到Presenter中,较为复杂的界面Activity代码量依然会不少。
3.致使Presenter的代码量过大。
可重用性。你能够把一些视图逻辑放在一个ViewModel里面,让不少View重用这段视图逻辑。 在Android中,布局里能够进行一个视图逻辑,而且Model发生变化,View也随着发生变化。
低耦合。之前Activity、Fragment中须要把数据填充到View,还要进行一些视图逻辑。如今这些均可在布局中完成(具体代码请看后面) 甚至都不须要再Activity、Fragment去findViewById()。这时候Activity、Fragment只须要作好的逻辑处理就能够了。
MVVM 在项目中的使用位置
View和ViewModel主要经过数据绑定和Command/Behavior进行交互,以下图所示:
有关Model(模型)和DTO的问题
MVVM的实践要点
视图(view)部分,xaml.cs 应该只有不多的代码或没有代码,若是你的xaml.cs包含大量的代码,那么极可能你MVVM用的不对头,须要检查其中代码的坏味道。Xaml和xaml.cs 只能包含处理界面、视图、显示样式、视图元素之间的交互、视图元素动画,等等的内容。
从重构的观点看,若是你的代码中ViewModel是可测试的,有详细的单元测试Unit Test,你的代码是OK的,不然须要检查其中的坏味道。
示例项目源代码下载: