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)的更多相关文章

  1. 10.model/view实例(4)

    任务:给表单的每一列添加列名. 思考: 1.只需要添加一个函数 headerData(). 横向方面添加列名 代码如下: QVariant MyModel::headerData(int sectio ...

  2. 10.model/view实例(3)

    任务:3x2的表格,第一个单元格显示当前时间 思考: 1.data函数里面QTime::currentTime()显示当前时间 2.但是这个事件是一个固定的时间,不会变动 3.需要时间变动,View就 ...

  3. 10.model/view实例(2)

    任务:显示一个2x3的表格,将表格中的数据显示如下: 思考: 1.如何显示数据和上个例子一样. 2.但是每个单元格的数据都是有角色划分的. Qt::ItemDataRole 3.View从Model中 ...

  4. 10.model/view实例(1)

    1.如图显示一个2x3的表格: 思考: 1.QTableView显示这个表 2.QAbstractTableModel作为模型类. 3.文档中找到subclass的描述 When subclassin ...

  5. Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good

    数据是一个集合,显示也是一个集合.例如一篇<西游记>的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现. 下面是将一个二 ...

  6. iOS View 模糊效果(毛玻璃)

    iOS View 模糊效果(毛玻璃)   相关资料 http://stackoverflow.com/questions/18404907/using-gpuimage-to-recreate-ios ...

  7. wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果

    上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个  两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...

  8. wing带你玩转自定义view系列(1) 仿360内存清理效果

    本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...

  9. Android View体系(四)从源码解析Scroller

    在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...

随机推荐

  1. VS2012的变态优化,双循环变单循环

    VS2010也是一样

  2. lambda 3

    .NET笔记系列:LAMBDA表达式常用写法   这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下 ...

  3. 【白痴弟弟和你加强应用层】阅读 Develop API Guides 思考(一个)

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 动态检測设备属性 关于targetSdkVersion的含义 关于onSaveInstanceState的高 ...

  4. OCP解决问题053-16 MEMORY_TARGET

    16.Setting which of the following initialization parameters enables Automatic Memory Management? A. ...

  5. 单选框和下拉框的jquery操作

    单选框 <input type="radio" name="rdSendType" value="email" checked=&qu ...

  6. Entity Framework的事务提交

    一组业务整体处理的行为叫一个事务.这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果.事物的Commit是执行了你的方法进行了数据库的提交,之前的sava都是放在缓存中并没有执行 ...

  7. 查看linux系统版本号命令

    一.查看内核版本号命令: 1) [root@SOR_SYS ~]# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012. ...

  8. 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 ...

  9. 开源Math.NET基础数学类库使用(09)相关数论函数使用

    原文:[原创]开源Math.NET基础数学类库使用(09)相关数论函数使用               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  10. VS2010中配置C#Project不生成.vhost.exe和.pdb文件的方法

    在VS2010中编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.p ...