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/

一篇不错的关于分析MVC的文章的更多相关文章

  1. 一篇不错的讲解Java异常的文章(转载)原作者已没法考证

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter ...

  2. 一篇不错的讲解Java异常的文章(转载)

    http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已 ...

  3. 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? OutputStreamWriter ou ...

  4. .net 开源模板引擎jntemplate 教程:基础篇之在ASP.NET MVC中使用Jntemplate

    在ASP.NET MVC 中使用Jntemplate 上一篇我们详细介绍了jntemplate的标签语法,本篇文章将继续介绍如何在ASP.NET MVC 中使用Jntemplate. 一.使用Jnte ...

  5. EF和MVC系列文章导航:EF Code First、DbContext、MVC

    对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...

  6. 第九节:从源码的角度分析MVC中的一些特性及其用法

    一. 前世今生 乍眼一看,该标题写的有点煽情,最近也是在不断反思,怎么能把博客写好,让人能读下去,通俗易懂,深入浅出. 接下来几个章节都是围绕框架本身提供特性展开,有MVC程序集提供的,也有其它程序集 ...

  7. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  8. 推荐几本不错的ASP.NET MVC书

    以前主要是做PHP应用的,由于工作需要,捡起来.NET, 特别是新技术层出不穷,找了几本书看,个人感觉还不错,网上也有电子版的下载 一. ASP.NET MVC4 Web 编程 O'Reilly出版社 ...

  9. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer ...

随机推荐

  1. ConfigParser读取记事本、notepad++修改后的配置文件会出现:ConfigParser.MissingSectionHeaderError

    使用ConfigParser来读取配置文件,经常会发现经过记事本.notepad++修改后的配置文件读取时出现下面的问题: ConfigParser.MissingSectionHeaderError ...

  2. 李洪强实现横向滚动的View<二>

    上一节中我们已经实现了一个带有图片,标题和价格label 的UIView 这节我们用这个view实现一个横向滚动的UIcollectionView 实现的效果如下:  01 - 创建CFTyreScr ...

  3. ruby oop学习

    class Man def initialize(name,age) @name=name @age=age end def sayName puts @name end def sayAge put ...

  4. freshStartTail 第一次启动时 抛弃旧的日志

    freshStartTail [on/off] (requires v8.18.0+) Default: off This is used to tell rsyslog to seek to the ...

  5. BS软件注册

    关于BS软件注册问题,目前的方式有通过加密狗访问的方式比较安全,本人为了节省使用成本,采用注册码的形式对每个客户端采用注册码的形式进行认证,防止用户使用同一账号在不同地方登陆使用,也可以防止一个账号, ...

  6. win7 64位系统 pl/sql 无法解析指定的连接标识符解决办法

    我用的是win764位,装好后,装了pl/sql 和toad,都连不上数据库,报错位“无法解析指定的连接标识符” 解决办法,经过研究发现安装目录有问题.默认会安装在“C:\Program Files ...

  7. DataContractJsonSerializer类

    DataContractJsonSerializer类 DataContractJsonSerializer类同样是提供JSON序列化的类.而且貌似有几个方法还和XML有点点关系. 注意用此类要引用S ...

  8. Extjs4-treepanel-解析json/fields中是否加入leaf的区别

    json解析list时,我原先的写法是: Map<String, Object> map = new HashMap<String, Object>(); map.put(&q ...

  9. FZU2235 国王的出游 水题

    因为只有1e5个点,所以直接离散化bfs就好 #include <cstdio> #include <cstring> #include <queue> #incl ...

  10. 【转载】CentOS LVM磁盘扩容

    转自:http://blog.sina.com.cn/s/blog_8882a6260101cpfs.html EXSI5.1主机有一个linux虚拟机,系统是centos运行httpd服务,因为是多 ...