MVVM实践

前言

在介绍MVVM框架以前,先给你们简单介绍一下MVC、MVP框架(因为本博文主要讲解MVVM,因此MVC和MVP将简化介绍,若是须要我将在之后的博文中补充进来)。html

架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不一样需求抽象成为抽象组件,而且可以描述这些抽象组件之间的通讯和调用。设计模式

框架:软件框架是项目软件开发过程当中提取特定领域软件的共性部分造成的体系结构,不一样领域的软件项目有着不一样的框架类型。框架不是现成可用的应用系统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。浏览器

设计模式:是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结,它强调的是一个设计问题的解决方法。架构

MVC(model view controller)框架--模型视图控制器 模型:

输入图片说明

  • M-Model : 业务逻辑和实体模型(biz/bean)
  • V-View : 布局文件(XML)
  • C-Controller : 控制器(Activity)

相信你们都熟悉这个框架,这个也是初学者最经常使用的框架,该框架虽然也是把代码逻辑和UI层分离,可是View层能作的事情仍是不多的,不少对于页面的呈现仍是交由C实现,这样会致使项目中C的代码臃肿,若是项目小,代码臃肿点仍是能接受的,可是随着项目的不断迭代,代码量的增长,你就会没办法忍受该框架开发的项目,这时MVP框架就应运而生。框架

数据处理流程以下图所示:布局

输入图片说明

用户操做浏览器,1.浏览器经过HTTP协议发出数据请求。2.控制器接收请求,经过路径2委托给数据模型,模型经过与逻辑层和持久层的交互,把处理结果反馈给控制器,控制器根据视图结果组装视图,并最终反馈给浏览器能够接受的html数据。单元测试

MVP框架:

输入图片说明

  • M-Model : 业务逻辑和实体模型(biz/bean)
  • V-View : 布局文件(XML)和Activity
  • P-Presenter : 完成View和Model的交互

MVP框架相对于MVC框架作了较大的改变,将Activity当作View使用,代替MVC框架中的C的是P,对比MVC和MVP的模型图能够发现变化最大的是View层和Model层不在直接通讯,全部交互的工做都交由Presenter层来解决。既然二者都经过Presenter来通讯,为了复用和可拓展性,MVP框架基于接口设计的理念你们天然就能够理解其用意。测试

但MVP框架也有不足之处:动画

1.接口过多,必定程度影响了编码效率。编码

2.业务逻辑抽象到Presenter中,较为复杂的界面Activity代码量依然会不少。

3.致使Presenter的代码量过大。

MVVM框架:

输入图片说明

  1. 可重用性。你能够把一些视图逻辑放在一个ViewModel里面,让不少View重用这段视图逻辑。 在Android中,布局里能够进行一个视图逻辑,而且Model发生变化,View也随着发生变化。

  2. 低耦合。之前Activity、Fragment中须要把数据填充到View,还要进行一些视图逻辑。如今这些均可在布局中完成(具体代码请看后面) 甚至都不须要再Activity、Fragment去findViewById()。这时候Activity、Fragment只须要作好的逻辑处理就能够了。

MVVM 在项目中的使用位置

输入图片说明

MVVM的Model、View、ViewModel分工

1. View

  • 负责界面和显示,界面构成元素有window, controls, page, dataTemplete, custom controls….
  • 代码一般有XAML和XAML.CS组成,但后台代码应该不多
  • 经过DataContext和ViewModel绑定
  • 不直接和Model交互!
  • 控件能够和ViewModel的公共属性绑定,update须要双向绑定
  • 控件能够触发Behavior/Command调用ViewModel的方法,Command是View到ViewModel的- - 单向通信 (View中触发事件,ViewModel中处理事件)

2. ViewModel

  • 主要包括界面逻辑和模型数据封装,Behavior/Command事件响应,绑定的属性定义等 ViewModel继承Model类,或者是Model的继承类
  • 是view和model的桥梁,是对Model的抽象,例如,model中数据格式是“年月日”,能够在view- Model中转换model中的数据为“日月年”以供视图(view)显示。
  • 维护视图状态
  • 实现属性或集合的change notification 输入图片说明

3. Model

  • 数据和业务逻辑
  • 客户端领域模型
  • 由data entities, business objects, repositories and services构成
  • 能够实现属性或集合的change notification
  • 能够实现validation 接口例如 IDataErrorInfo

View和ViewModel主要经过数据绑定和Command/Behavior进行交互,以下图所示:

输入图片说明

有关Model(模型)和DTO的问题

输入图片说明

MVVM的实践要点

  1. View分离要完全,不要有坏味道

视图(view)部分,xaml.cs 应该只有不多的代码或没有代码,若是你的xaml.cs包含大量的代码,那么极可能你MVVM用的不对头,须要检查其中代码的坏味道。Xaml和xaml.cs 只能包含处理界面、视图、显示样式、视图元素之间的交互、视图元素动画,等等的内容。

  1. ViewModel要可测试输入图片说明

从重构的观点看,若是你的代码中ViewModel是可测试的,有详细的单元测试Unit Test,你的代码是OK的,不然须要检查其中的坏味道。

输入图片说明

WPF实现MVVM的示例

示例项目源代码下载:

http://files.cnblogs.com/hielvis/WpfMVVMSample.rar

相关文章
相关标签/搜索