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 ...
随机推荐
- 比較Swift与HDFS话Ceph本质(by quqi99)
作者:张华 发表于:2014-06-21版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) 作者将又 ...
- [WebView五学习]:调试Web Apps
上一篇我们学习了([WebView学习之四]:迁移到Android4.4版本号的WebView),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jia ...
- 重新想象 Windows 8 Store Apps (33) - 关联启动: 使用外部程序打开一个文件或uri, 关联指定的文件类型或协议
原文:重新想象 Windows 8 Store Apps (33) - 关联启动: 使用外部程序打开一个文件或uri, 关联指定的文件类型或协议 [源码下载] 重新想象 Windows 8 Store ...
- 设计Mysql索引的原则
1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出如今WHERE 子句中的列,或连接子句中指定的列,而不是出如今SELECT keyword后的选择列表中的列. 2. 使用惟一索引 ...
- C# List使用District去重复数据
class ListDistinctDemo { static void Main(string[] args) { List<Person> personList = new List& ...
- Partition List -- LeetCode
原题链接: http://oj.leetcode.com/problems/partition-list/ 这是一道链表操作的题目,要求把小于x的元素按顺序放到链表前面.我们仍然是使用链表最经常使用 ...
- ubuntu快捷键设置,查看系统
设置system setting于.点击键盘keyboard,有捷径keyboard shortcut.但也设置快捷键本身. 版权声明:本文博主原创文章,博客,未经同意不得转载.
- SpringMVC Ajax返回的请求json
的方式来解决在中国字符串乱码问题
1.org.springframework.http.converter.StringHttpMessageConverter类是类处理请求或相应的字符串.和默认字符集ISO-8859-1,所以当返回 ...
- Eclipse4.4设备egit插件提交本地项目代码到远程仓库
一.设备egit 打开Eclipse的Marketplace.在搜索框中输入egit就可以,能够看到Eclipse4.4已经默认安装了egit,当然假设有新版本号的egit公布的话,也能够在下图上点击 ...
- 使用WebBrowser,内存一直增加的解决办法
-- in class definition [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetS ...