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 ...
随机推荐
- 移植 libuv 至 Visual C++ 6.0 并支持 Windows XP 编译系统
移植版本 libuv:https://github.com/liigo/libuv-vc6 (支持VC6和XP.作者Liigo). 我从一年前(大概2013年6,7月份)開始在业余时间做这项移植工作, ...
- 数据结构 - trie
#include <cstring> #include <iostream> #include <map> #include <cstdio> usin ...
- 轮播图片 高效图片轮播,两个imageView实现
该轮播框架的优势: 文件少,代码简洁 不依赖任何其他第三方库,耦合度低 同时支持本地图片及网络图片 可修改分页控件位置,显示或隐藏 自定义分页控件的图片,就是这么个性 自带图片缓存,一次加载,永久使用 ...
- java反射机制性能优化
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.uti ...
- java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)
我遇到这个错误是因为在引用脚本目录时,设置错了位置.设置成脚本所在目录的上级目录. lua使用和加载初始化方法 在java中使用lua,使用需要引用 luaj-jse-2.0.2.jar 同时需要使用 ...
- 【Java GUI】Java GUI基金会
AWT和Swing Swing是个AWT改进和扩展. 书写GUI规划.Swing和AWT曾效力.他们共存 Java基础类(JFC)于. 虽然AWT和Swing都提供了构造图形界面元素的类.但它们的虫药 ...
- Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)
问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...
- 设计模式Adapter模式的五分钟
五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...
- C语言标准库函数qsort具体解释
1 函数简单介绍 功 能: 使用高速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(c ...
- Android技术——切换视图(两)随着ViewPage达到Tab幻灯片浏览
Android技术--切换视图(一)~(四)在资源项目:https://github.com/YongYuIT/MeiNv_Liulanqi 一.早期android(android.support.v ...