Model-View-Presenter(MVP)
Model-View-Presenter(MVP)模式
Model-View-Presenter(MVP)是一种应用程序表示层的设计模式。该设计模式最早于90年代由Taligent提出,并率先在C++和Java中推广开来。在MVP模式中,视图层(View)和模型层(Model)被巧妙地分离开来,视图层提供一个给表示层(Presenter)调用的接口,通过该接口,表示层(Presenter)能够与依赖系统其它部分的视图元素进行交互。
在MVP模式中,Model负责实现业务逻辑,保存数据,状态信息,Model仅仅向Presenter提供一组服务接口,隐藏了内部实现的细节;View负责与用户交互,它接收用户的操作、输入信息,与Presenter交互获得数据,展示给用户;Presenter是View和Model的中间层,它接收来自View的输入,并将其传递给Model,然后依据处理结果更新View。下图演示了Model,View,Presenter三者的交互逻辑。

MVP模式自90年代提出以来,已经在软件工程领域引起了广泛的讨论。Martin Fowler在自己的论文和著作中,介绍了一些MVP模式的实现方法,但是很少人能够在具体的程序中使用MVP模式,实现MVP模式这一过程很大程度上依赖于开发者的个人经验。
与传统的表示层相比,MVP模式下表示层的优势体现在下面三个方面:
(1)View与Model完全隔离。得益于此,Model和View之间具有良好的松耦合设计,这意味着,如果Model或View中的一方发生变化,只要交互接口不变,另一方就没必要对上述变化做出改变。这使得Model层的业务逻辑具有很好的灵活性和可重用性。
(2)Presenter与View的具体实现技术无关。也就是说,采用诸如Windows表单,WPF,Web表单等用户界面构建技术中的任意一种来实现View层,都无需改变系统的其他部分。甚至为了使B/S,C/S部署架构能够被同时支持,应用程序可以用同一个Model层适配多种技术构建的View层。
(3)可以进行View的模拟测试。过去,由于View和Model之间的紧耦合,在Model和View同时开发完成之前对其中一方进行测试是不可能的。出于同样的原因,对View或Model进行单元测试很困难。现在,MVP模式解决了所有的问题。在MVP模式中,View和Model之间没有直接依赖,开发者能够借助模拟对象注入测试两者中的任一方。
这些年来,在使用设计模式和最佳实践方面,我辅导过很多开发者。一个伴随始终的问题是:Model-View-Controller(MVC)模式和Model-View-Presenter(MVP)模式之间有什么区别?令人吃惊的是,答案比你想象的复杂的多。
在深入研究两者不同之前,让我们看看MVC和MVP模式是如何工作的,它们能够给开发者带来哪些好处?MVC和MVP模式已经流行了很多年,两者都体现了面向对象设计的一个关键原则,也就是,分离显示视图和业务逻辑。当前有很多的框架都是基于该模式的,如Java Struts,ROR,Microsoft Smart Client Software Factory,Microsoft Web Client Software Factory,加上最近开源的ASP.NET MVC Framework。
Model-View-Controller(MVC)模式

MVC模式,是一种用户界面表示模式,核心是要将表示层(View)和业务逻辑层(Model)分离。MVC模式将职责分成三层,View层负责渲染用户界面元素,Controller层负责响应用户动作,Model负责业务逻辑和管理状态。在大多数实现中,三层能够直接交互,然而有些情况下,Controller负责决定显示哪一个View;
Model-View-Presenter(MVP)模式

MVP模式是基于MVC模式的用户界面表示技术。MVP模式将职责分成四层:View负责渲染用户界面元素,提供接口供Presenter调用;Presenter充当Model和View的中间人;Model层负责处理业务逻辑和管理状态。在某些实现中,Presenter需要通过服务接口层(Service / Controller Layer)与Model交互。View和服务接口层通常用来为Presenter和Model编写单元测试。
MVC 和 MVP模式的优势和劣势
在使用任何一种设计模式之前,都需要考虑该模式的优势和劣势。毫无疑问,使用MVP和MVP模式有很多好处(参见下面列表),但有些劣势也不可忽略,最大的劣势是增加了一定的复杂性和学习成本。
(1)松耦合;
(2)职责分离清晰;
(3)测试驱动;
(4)重用代码;
(5)隐藏数据访问;
(6)可扩展性;
MVC 和 MVP模式的关键区别
所以,什么是MVC 和 MVP模式的关键区别?两者之间主要的区别是其实现方式和偶尔有些情况下需要同时使用Presenter和Controller。
下面是具体的比较:
(1)MVP:View和Model之间是松耦合的,Presenter负责将Model绑定到View。通常情况下,View和Presenter是一对一的关系,复杂的View可能有多个Presenter。
(2)MVC:Controller是基于操作的,能够在View之间共享。Controller负责决定显示哪个View。
到此,对技术文摘Model-View-Present (MVP) Pattern for Architecture Android的翻译结束,希望能够增加读者对MVP模式的认识。
参考文献:
[1] 英文原文:Model-View-Present (MVP) Pattern for Architecture Android。
本文历史:
- 2015-08-04 初稿完成。
Model-View-Presenter(MVP)的更多相关文章
- 10.model/view实例(4)
任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int sectio ...
- 10.model/view实例(3)
任务:3x2的表格,第一个单元格显示当前时间 思考: 1.data函数里面QTime::currentTime()显示当前时间 2.但是这个事件是一个固定的时间,不会变动 3.需要时间变动,View就 ...
- 10.model/view实例(2)
任务:显示一个2x3的表格,将表格中的数据显示如下: 思考: 1.如何显示数据和上个例子一样. 2.但是每个单元格的数据都是有角色划分的. Qt::ItemDataRole 3.View从Model中 ...
- 10.model/view实例(1)
1.如图显示一个2x3的表格: 思考: 1.QTableView显示这个表 2.QAbstractTableModel作为模型类. 3.文档中找到subclass的描述 When subclassin ...
- Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good
数据是一个集合,显示也是一个集合.例如一篇<西游记>的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现. 下面是将一个二 ...
- iOS View 模糊效果(毛玻璃)
iOS View 模糊效果(毛玻璃) 相关资料 http://stackoverflow.com/questions/18404907/using-gpuimage-to-recreate-ios ...
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个 两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...
- wing带你玩转自定义view系列(1) 仿360内存清理效果
本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...
- Android View体系(四)从源码解析Scroller
在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...
随机推荐
- VS2012的变态优化,双循环变单循环
VS2010也是一样
- lambda 3
.NET笔记系列:LAMBDA表达式常用写法 这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下 ...
- 【白痴弟弟和你加强应用层】阅读 Develop API Guides 思考(一个)
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 动态检測设备属性 关于targetSdkVersion的含义 关于onSaveInstanceState的高 ...
- OCP解决问题053-16 MEMORY_TARGET
16.Setting which of the following initialization parameters enables Automatic Memory Management? A. ...
- 单选框和下拉框的jquery操作
单选框 <input type="radio" name="rdSendType" value="email" checked=&qu ...
- Entity Framework的事务提交
一组业务整体处理的行为叫一个事务.这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果.事物的Commit是执行了你的方法进行了数据库的提交,之前的sava都是放在缓存中并没有执行 ...
- 查看linux系统版本号命令
一.查看内核版本号命令: 1) [root@SOR_SYS ~]# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012. ...
- Error Code: 1318. Incorrect number of arguments for PROCEDURE company.new_procedure; expected 2, got
1.错误叙述性说明 20:27:34 call new_procedure(20150112) Error Code: 1318. Incorrect number of arguments for ...
- 开源Math.NET基础数学类库使用(09)相关数论函数使用
原文:[原创]开源Math.NET基础数学类库使用(09)相关数论函数使用 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...
- VS2010中配置C#Project不生成.vhost.exe和.pdb文件的方法
在VS2010中编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.p ...