说不尽的MVVM(1) – Why MVVM
最近学的一篇课文《说不尽的狗》竟让我有了写《说不尽的MVVM》这一想法,事非亵渎,实出无奈。我在刚学WPF不久时听说有MVVM这种东西,做了下尝试,发现他能给程序的设计带来很大的好处。好东西当然要分享给大家,下面,我们就来认识下MVVM。
预备知识
阅读本文,我假定你具备以下知识:
- C# 基础知识
- XAML基础知识
- 对事件驱动模型的了解
- 听说过MVC、MVP、单元测试
MVVM是什么,好吃吗?
MVVM全称为Model-View- View Model,是软件工程中的一种软件设计模式,相信很多朋友都知道 MVC (Model-View-Controller) 和 MVP (Model-View-Presenter) 。为了使软件在健壮性、代码重用和结构方面更上一个层次,人们相继提出了MVC和MVP,MVP主要用在WinForm和WebForm里面,实现UI、数据和业务业务逻辑的分离。MVVM的目标和思想MVP类似,但MVVM建立在WPF、Windows Phone、WinRT等基于XAML的表现层技术之上,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
至于好不好吃,试过才知道:D
给我一个用MVVM的理由
传统的事件驱动模型(前)和MVVM模式(后)
这两张图是传统开发模式和MVVM模式的逻辑处理简化图,上面说到MVVM灵活和高效,主要体现在以下几方面
数据驱动UI
事件驱动的程序设计模型在传统的WinForm开发模式中最常见不过了,包括WPF也支持这种模式。在这种模式中,程序的主角是UI,通过UI控件事件的触发对数据进行处理,然后更新UI。整个过程中,UI处于主导地位,数据处于被动状态,在事件处理代码执行完成后,数据被转化成了UI控件的状态。
在MVVM中,数据和逻辑处于一个独立的View Model中,由View Model中的逻辑对数据进行处理,数据处于主动地位, UI的任务是关注数据的更改并将它显示出来,数据不再属于UI,真正成为程序的主角。
更低的耦合度
从上面两张图可以看到,在传统的事件驱动模式中,更新UI时不可避免的要引用UI上的对象,如果要从UI上获取输入,还需要访问UI对象的属性,这样的逻辑是离不开UI的,一旦UI发生改变,即使后台逻辑不变(比如将输入用的TextBox换成Slider),后台代码就要变,痛苦可想而知。
MVVM模式中,数据是独立于UI的,数据与UI的耦合是松散的,View Model把数据以属性的形式暴露出来。UI要做的事情,就是把数据"送过来",把数据"拿回去"。
更新UI不抓狂
在传统的开发模式中,在工作线程中更新UI是一件非常麻烦的事情,这也是UI驱动数据带来的负面影响之一,在MVVM中,我们可以在工作线程中直接修改View Model的数据(只要数据是线程安全的),剩下的数据绑定帮你搞定。
更高效的团队协作
MVVM的分工是非常明显的,View Model 负责提供数据,View负责展现数据,由于View和View Model之间是松散耦合的,完全可以让程序员一边写View Model,设计师一边用Blend设计View,同时工作,效率更高。
更好的复用性
上面说到View Model独立于UI,不妨把UI理解成数据的衣服,衣服可以换,UI当然可以换,我们可以把同一个View Model用到多个View中,比如桌面版的程序和Win8 App甚至是 Windows Phone共用一个View Model。
更好的可测试性
既然View Model里面是数据和业务逻辑,因此,不用等到UI写好,我们已经可以用单元测试去检测业务逻辑的正确性了。
需要准备什么
.NET Framework 4.5
Visual Studio
MVVM light toolkit
Windows 8 / Silverlight / Windows Phone 的SDK任选一个
说不尽的MVVM(1) – Why MVVM的更多相关文章
- [WPF] 使用 MVVM Toolkit 构建 MVVM 程序
1. 什么是 MVVM Toolkit 模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式. 借助 MVVM,可以在 XAML 中以声明方式定义 UI ...
- Pro mvvm读书笔记mvvm中的VM
一.构建ViewModels 设计模式的其中一个目标就是抽象构造一个给出指定类型的对象或者实现指定类型的接口的过程.需要把类给客户端,让客户端去使用,但是要隐藏类是具体的实现细节. 1.1The Ap ...
- 说不尽的MVVM(2) – MVVM初体验
知识预备 阅读本文,我假定你已经具备以下知识: C#.WPF基础知识 了解Lambda表达式和TPL 对事件驱动模型的了解 知道ICommand接口 发生了什么 某程序员接到一个需求,编写一个媒体渲染 ...
- ReactiveCocoa 和 MVVM 入门 (转)
翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...
- 【长篇高能】ReactiveCocoa 和 MVVM 入门
翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...
- 【转】伟大的RAC和MVVM入门(一)
原文:http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction/ 翻译自ReactiveCocoa and MVV ...
- MVVM、MVC框架的认识
推荐博客: https://blog.csdn.net/jia12216/article/details/55520426 https://www.cnblogs.com/sunny_z/p/7093 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
随机推荐
- 【原】JS正则表达式里的控制符
正则表达式易于使用而又让人费解,乍一看上去,就像是一行行的乱码,但是它的功能确实又不容小觑.今天整理正则时,纠正了自己的一个误解. 先缕一缕: 正则表达式的两种声明方式: 字面量.构造器 (RegEx ...
- PHP基于SOAP实现webservice
简单对象访问协议(SOAP)是一种轻量的.简单的.基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息. SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( H ...
- 理解GC日志
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...
- 使用apache和htaccess对目录访问设置密码保护配置教程
对目录设置密码保护配置说明我们有时候访问某些网站的时候,要求输入用户名和密码才能访问.这是为了保护隐私,只让经过许可的人访问.在本教程中主要介绍两种方法,一种是通过apache httpd.conf配 ...
- 第一章 第一个spring boot程序(转载)
第一章 第一个spring boot程序 本编博客转发自:http://www.cnblogs.com/java-zhao/p/5324185.html 环境: jdk:1.8.0_73 mave ...
- 用PHP实现URL转换短网址的算法示例
短网址就是把一个长的地址转换在超级短的网址,然后访问短网址即可跳转到长网址了,下面来看用PHP实现URL转换短网址的算法与例子. 短网址(Short URL) ,顾名思义就是在形式上比较短的网址.在W ...
- Android打包签名
Ⅰ.用jdk和sdk自带工具打包签名 a.把jdk下的keytool.exe和jarsigner.exe所在目录(两个工具在同一目录) 添加到环境变量path 1)新建环境变量package,pack ...
- Github心得体会
Github是一个代码托管的网站,以前端的代码为主,还有很多互动. 在我的理解看来,github并不仅仅是一个代码库,你可以自由注册,推送自己一些感兴趣编写的源代码.它不是单纯的保存代码,更多的是让 ...
- 用JS制作简易的可切换的年历,类似于选项卡
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...
- 编译jsoncpp库以及要注意的问题
原创文章,转载请注明原作者与本文原始URL. 版本:jsoncpp-src-0.5.0.zip简介:jsoncpp是用cpp实现的json库,可以拼装,解析,生成json串.我们要把他编译成动态库.这 ...