MVC、 MVP、 MVVM之间的区别

一、 简介

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

二、MVC/MVP

4418040-23d097570cd00e68

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、MVP

4418040-412961f9dc346e84

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的复杂逻辑。

三、 M-V-VM

4418040-71e568802be35f09

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。

欢迎关注我的公众号(同步更新文章)DoNet技术分享平台

阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java散列法的运用实例,Java HashMap compute() 使用方法及示例

Java HashMap compute() 使用方法及示例Java HashMap compute()方法计算一个新值,并将其与哈希映射中的指定键相关联。compute()方法的语法为:hashmap.compute(K key, BiFunction remappingFunction)compute()参数compute()方法有两个参数:ke…

team geek

1. 转载自http://book.douban.com/review/6007037/,版权归丸子(^.^)v所有。 New Google employees (we call “Nooglers”) often ask me what makes me effective at what I do. I tell them only half-jokingly that it’s very simple: I do the Right Thing for…

程序员经典语录

1.A good programmer is someone who always looks both ways before crossing a one-way street. (Doug Linder)好的程序员即使在过单行道时也总是会环顾两边。2.Don’t worry if it doesn’t work right. If everything did, you’d be out of a job. (Mosher’s Law of Soft…

数字图像处理应用matlab,数字图像处理与应用(MATLAB版)

第 1章 绪论 1n1.1 图像的概念 1n1.2 图像的分类 2n1.3 图像的表示 2n1.3.1 图像信号的表示 2n1.3.2 数字图像的表示 3n1.3.3 颜色模型 4n1.4 …

HDU 3948 不同回文子串个数

集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重。对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀进行比较去重。 几组数据 abacaba…

如何成为一名优秀的程序员?

1、理解技术债务技术债务就像信用卡一样,会有很高的利息率,时间越长,修复所花的代价就越大,程序员对这个要有深刻的认识。同时团队应该培养一种保证设计质量的文化,应当鼓励重构、同时也应当鼓励其它有关代码质量的实践…

php 发邮件附件pdf,php – 使用TCPDF发送电子邮件附件 | 码农网

我有一个简单的课程申请表,填写完成后,会向申请人发送一封电子邮件,并附上他选择作为pdf附件的课程的费用报价.我正在使用TCPDF并使用会话变量将数据从表单传递到库.内容采用 html 格式.生成PDF并根据需要作为附件发送.问题是它是空白的..只有页眉和页脚在文档中.在 linux 中尤…

数据库同步传输软件

Navicat转载于:https://www.cnblogs.com/jizl/p/4995959.html

DoNet 高效开发必备开发工具

工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及…

php eval 语法错误,PHP eval和捕获错误(尽可能多)

我找到了一个很好的替代方案/答案 .首先,让我首先说当我设置error_reporting(E_ALL)时,nikic的建议有效;通知显示在PHP输出中,并且由于OB,它们可以被捕获 .接下来,我发现了这个非常有用的代码:/*** Check t…

防止表单重复提交的解决方案整理

用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见。刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交。此类问题是因为浏览器重复提交HTTP请求导致。下面列出了四种比较常用的解决方…

免费字典api ,查询汉字完整信息

最大最全的新华汉语词典,字典api根据接口列表返回的汉字id,查询汉字完整信息。 接口名称:字典api 接口平台:第三方api 接口地址:http://v.juhe.cn/xhzd/queryid 支持格式:json/xml 请求方式:htt…

python正则去除换行符,关于python:用于删除换行符的正则表达式

我是Python的新手,我遇到了正则表达式问题。 我正在尝试删除文本文件中每行末尾的换行符,但前提是它跟在小写字母后面,即[a-z]。 如果该行的结尾以小写字母结尾,我想用空格替换换行符/换行符。这是我到目前为止所得到的&#xff1…

收集一些程序员励志经典名言

1、作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。2、程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇…

Android develop 国际化

转自别人的一片文章,出处以找不到了,觉得写得不错,记录一下 一、概念 1.Internationalization(I18N) 国际化 使得App在不改的源码、资源文件的情况下,能够适应各国、各文化、各语言 是L10N的基础 2.Localization(L10N) 本地化 为A…

php留言板记录ip,如何用php程序记录来访IP

如何用php程序记录来访IP关注:226 答案:4 手机版解决时间 2021-02-16 00:05提问者失夜久伴你2021-02-15 01:22如何用php程序获取来访IP,然后保存在txt文件中,并且只保留最新的30个数据.最佳答案二级知识专家追尋☆①秒方向2021-02-15 02:19有一个全局的变量&#…

【基础】jquery全选、反选、全不选代码

1、JS代码function ($) {//全选 反选 全不选$("#selAll").click(function () {$(".lists :checkbox").not(:disabled).prop("checked", true);});$("#unSelAll").click(function () {$(".lists :checkbox").not(:disabled).…

oracle 11g重新安装配置,Oracle 11g数据库安装和卸载教程

Oracle11g的安装教程同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup去掉安全更新的选项,直接下一步选择创建和配置数据库,点击下一步选择服务器类,点击下一步选择单例数据库…

C语言中strdup函数使用方法

头文件&#xff1a;#include <string.h> 定义函数&#xff1a;char * strdup(const char *s); 函数说明&#xff1a;strdup()会先用malloc()配置与参数s 字符串相同的空间大小&#xff0c;然后将参数s 字符串的内容复制到该内存地址&#xff0c;然后把该地址返回。该地址…

高级程序员和低级程序员的区别

低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无 bug. 正如一惯的那样, 低级程序员之所以低级, 正是因为他们勉强能看到(或者根本看不到)事物的表象而看不到本质. 所以, 低级程序员总结出的一切东西, 你都可以大胆的忽略。所…