1 简介

  英文原文:MVC vs. MVP vs. MVVM

  三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试。

  2 MVC/MVP

  2.1 MVC

  1、View接受用户的交互请求

  2、View将请求转交给Controller

  3、Controller操作Model进行数据更新

  4、数据更新之后,Model通知View数据变化

  5、View显示更新之后的数据

  View和Controller使用Strategy模式实现,View使用Composite模式,View和Model通过Observer模式同步信息。Controller不知道任何View的细节,一个Controller能被多个View使用。MVC的一个缺点是很难对Controller进行单元测试,Controller操作数据,但是如何从View上断言这些数据的变化呢?例如,点击一个View的按钮,提交一个事件给Controller,Controller修改Model的值。这个值反映到View上是字体和颜色的变化。测试这个Case还是有点困难的。

  2.2 MVP

  1、View接受用户的交互请求

  2、View将请求转交给Presenter

  3、Presenter操作Model进行数据库更新

  4、数据更新之后,Model通知Presenter数据发生变化

  5、Presenter更新View的数据

  Presenter将Model的变化返回给View。和MVC不同的是,Presenter会反作用于View,不像Controller只会被动的接受View的指挥。正常情况下,发现可以抽象View,暴露属性和事件,然后Presenter引用View的抽象。这样可以很容易的构造View的Mock对象,提高可单元测试性。在这里,Presenter的责任变大了,不仅要操作数据,而且要更新View。

  在现实中,MVP的实现会根据View的充、贫血而有一些不同,一部分倾向于在View中放置简单的逻辑,在Presenter放置复杂的逻辑;另一部分倾向于在presenter中放置全部的逻辑。这两种分别被称为:Passive View和Superivising Controller。

  在Passive View中,为了减少UI组件的行为,使用Controller不仅控制用户事件的响应,而且将结果更新到View上。可以集中测试Controller,减小View出问题的风险。

  在Superivising Controller中的Controller既处理用户输入的响应,又操作View处理View的复杂逻辑。

  3 M-V-VM

  MVVM是在原有领域Model的基础上添加一个ViewModel,这个ViewModel除了正常的属性意外,还包括一些供View显示用的属性。例如在经典的MVP中,View有一个属性IsCheck,需要在Presenter中设置View的IsCheck值。但是在MVVM中的Presenter也会有一个IsCheck属性来同步View的IsCheck属性,可能会用到Observer模式同步IsCheck的值。在MVVM中,Presenter被改名为ViewModel,就演变成了你看到的MVVM。在支持双向绑定的平台,MVVM更受欢迎。例如:微软的WPF和Silverlight。

该文章转载自:http://kb.cnblogs.com/page/120678/

最新文章

  1. 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux
  2. MyEclipse 10 之下Web Service 的创建和实现
  3. C++primer 练习12.6
  4. CentOS-6.4无线上网命令行配置
  5. ASP.NET Cookie对象到底是毛啊?(简单小例子)
  6. 【面试题004】c/c++字符串,替换空格
  7. java应用uploadify 3.2丢失session
  8. Mac OS环境下媒体文件分割工具mediafilesegmenter的简单使用(生成M3U8 TS文件)
  9. C语言动态内存管理
  10. xcode 升级插件失效问题
  11. TCP服务器端和客服端(一)
  12. Android - Unable to execute dex: Multiple dex files define
  13. [开源]Dapper Repository 一种实现方式
  14. JS 禁止Ctrl+C + 禁止右键操作
  15. promise 的学习
  16. CentOS 7离线安装CDH 5.16.1完全指南(含各种错误处理)
  17. 『cs231n』绪论
  18. hpu1165 贪心
  19. apk签名方法
  20. HBase 架构与工作原理3 - HBase 读写与删除原理

热门文章

  1. 再撸一次简单的NODE.JS
  2. CodeChef A
  3. QT4项目升级到QT5遇到的问题和解决方法
  4. iCloud 包括文稿与数据、日历、提醒事项、 通讯录、备忘录、Safari书签
  5. jquery ajax传递数组给php
  6. SpringBoot入门 一 构建简单工程
  7. VJP1063 迎春舞会之集体舞(DP)
  8. 分布式缓存BeIT Memcached简介
  9. java CopyOnWriteArrayList的使用
  10. 简单的cocos2d-x手势(转)