微软的WPF带来了新的技术体验,如Sliverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性揉合进去,以应对客户日益复杂的需求变化。

WPF的数据绑定与Presentation Model相集合是非常好的做法,使得开发人员可以将View和逻辑分离出来,但这种数据绑定技术非常简单实用,也是WPF所特有的,所以我们又称之为Model-View-ViewModel (MVVM)。这种模式跟经典的MVP(Model-View-Presenter)模式很相似,除了你需要一个为View量身定制的model,这个model就是ViewModel。ViewModel包含所有由UI特定的接口和属性,并由一个ViewModel 的视图的绑定属性,并可获得二者之间的松散耦合,所以需要在ViewModel 直接更新视图中编写相应代码。数据绑定系统还支持提供了标准化的方式传输到视图的验证错误的输入的验证。
如下图MVP设计模式架构所示。

 
在视图(View)部分,通常也就是一个Aspx页面。在以前设计模式中由于没有清晰的职责划分,UI 层经常成为逻辑层的全能代理,而后者实际上属于应用程序的其他层。MVP 里的M 其实和MVC里的M是一个,都是封装了核心数据、逻辑和功能的计算关系的模型,而V是视图(窗体),P就是封装了窗体中的所有操作、响应用户的输入输出、事件等,与MVC里的C差不多,区别是MVC是系统级架构的,MVP是用在某个特定页面上的,也就是说MVP的灵活性要远远大于MVC
,实现起来也极为简单。
我们再从IView这个interface层来解析,它可以帮助我们把各类UI与逻辑层解耦,同时可以从UI层进入自动化测试自动化测试(Unit/Automatic Test)并提供了入口,在以前可以由WinForm/Web Form/MFC等编写的UI是通过事件Windows消息与IView层沟通的。WPF与IView层的沟通,最佳的手段是使用Binding,当然,也可以使用事件;Presenter层要实现IView,多态机制可以保证运行时UI层显示恰当的数据。比如Binding,在程序中,你可能看到Binding的Source是某个interface类型的变量,实际上,这个interface变量引用着的对象才是真正的数据源。
MVC模式大家都已经非常熟悉了,在这里我就不赘述,这些模式也是依次进化而形成MVC—>MVP—>MVVM。有一句话说的好:当物体受到接力的时候,凡是有
界面的地方就是最容易被撕下来的地方。因此,IView作为公共视图接口约束(契约)的一层意思;View则能传达解耦的一层意思。
下面介绍一下MVVM设计模式。因为WPF技术出现,从而使MVP设计模式有所改进,MVVM 模式便是使用的是数据绑定基础架构。它们可以轻松构建UI的必要元素。
如,下图所示MVVM架构图。 
可以参考The Composite Application Guidance for WPF(prism),prism V2下载源码
View绑定到ViewModel,然后执行一些命令在向它请求一个动作。而反过来,ViewModel跟Model通讯,告诉它更新来响应UI。这样便使得为应用构建UI非常的容易。往一个应用程序上贴一个界面越容易,外观设计师就越容易使用Blend来创建一个漂亮的界面。同时,当UI和功能越来越松耦合的时候,功能的可测试性就越来越强。
在MVP模式中,为了让UI层能够从逻辑层上分离下来,设计师们在UI层与逻辑层之间加了一层interface。无论是UI开发人员还是数据开发人员,都要尊重这个契约、按照它进行设计和开发。这样,理想状态下无论是Web UI还是Window UI就都可以使用同一套数据逻辑了。借鉴MVP的IView层,养成习惯。View Model听起来Presenter要贴切得多;会把一些跟事件、命令相关的东西放在Controler里。
参考示例:PersonViewModel层
public FamilyTreeViewModel(Person rootPerson)
{
    _rootPerson = new PersonViewModel(rootPerson);

_firstGeneration = new ReadOnlyCollection<PersonViewModel>(
        new PersonViewModel[] 
        { 
            _rootPerson 
        });
    _searchCommand = new SearchFamilyTreeCommand(this);
}

在这里我不在赘述,详细应用实例参考:
Simplifying the WPF TreeView by Using the ViewModel Pattern
源码下载
本文转自 高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196071 ,如需转载请自行联系原作者

浅谈MVP与Model-View-ViewModel(MVVM)设计模式相关推荐

  1. 浅谈 MVP in Android

    一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:"MVC的演化版本","让Model和View完全解耦"等等.本篇博文仅 ...

  2. Android 浅谈MVP模式 一

    一直想记录下最近学习MVP模式的一些心得,又怕写的太渣,没办法,先写写然后及时更新. 我会粘贴一些代码,对于MVP模式的理解会在代码中详细注释 例一:闪屏界面判断是否已经登录 Presenter:对于 ...

  3. 浅谈安卓apk安装过程中的设计模式

    最近一直在读安卓安装过程的源代码,也在博客中分析了整个安装流程,但是只是一步步流水账的形式,对代码整体设计架构没涉及,但是看下来安卓framework的设计运用了大量设计模式思想,这种设计模式利于代码 ...

  4. 单例设计模式java,浅谈Java编程中的单例设计模式

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

  5. android mvvm_Android MVVM设计模式

    android mvvm In this tutorial, we'll be discussing and implementing the Android MVVM Architectural P ...

  6. 浅谈 MVC、MVP 和 MVVM 架构模式

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 MVX 中的 Model 谈谈 MVX 中的 View 谈谈 MVX 中的 Controller 浅谈 MVC.MVP ...

  7. vue学习笔记-02-前端的发展历史浅谈mmvm设计理念

    vue学习笔记-02-前端的发展历史浅谈mmvm设计理念 文章目录 1. MVVM模式的实现者 2.第一个vue程序 3.什么是mvvm? 4.为什么要用mvvm? 5.mvvm的组成部分 7.MVV ...

  8. 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~

    写在前面 讲道理,这次是真的笔者很久都没有更新 blog 了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...

  9. 第15.22节 PyQt(Python+Qt)入门学习:Model/View架构详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.简介 在PyQt和Qt中,Model/View架构是图形界面开发时用于管理数据和界面展现方式的关 ...

最新文章

  1. 2021年大数据常用语言Scala(二十):函数式编程 介绍
  2. 从0到1开发实战手机站(二):Git提交规范配置
  3. 宽度如何设置 滑动条_【Axure9百例】26.得到交互设计左右滑动
  4. 数据库设计(三)概念数据模型
  5. Redis 集群搭建和简单使用
  6. Linux自动部署框架,在Linux下编写一个集群自动化测试框架
  7. Java 8的方法参考进一步限制了重载
  8. VC++中使用内存映射文件处理大文件
  9. MySQL之索引的创建和删除
  10. 安装选择Arduino Leonardo新手入门体验
  11. 文本格式化标签(HTML)
  12. BOM,DOM, JS,JQ
  13. MATLAB图形绘制--添加图例
  14. 调和平均数,几何平均数,算数平均数,平方平均数
  15. 如何在Systemd中使用Shell脚本创建和运行新的服务
  16. android系统与苹果手机号码,苹果手机号码怎么导入另一个手机安卓(全程图解其操作流程)...
  17. 关于在数据库中如何存储时间这件事
  18. 使用paypal-php-sdk开发php国际支付
  19. 远程ubuntu桌面_如何在Ubuntu上设置远程桌面
  20. 笔记本电脑电池的保养和优化

热门文章

  1. 中文字串截取无乱码的问题
  2. 电脑很卡~~~~为什么???
  3. 树形动规_(战略游戏)
  4. 想成领袖?先瞄准老板身边的位置
  5. 吴恩达深度学习编程作业汇总
  6. 如何有效的使用 for循环和Iterator遍历
  7. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
  8. python os.access_os.access(path, mode)
  9. android studio课程管理系统,8 个最优秀的 Android Studio 插件
  10. java中日历类:Calendar