MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。Alex在他的blog中对于这两者之间的比较很直观也比较清楚,原文可以下面的地址找到:
http://ameleta.spaces.live.com/blog/cns!5F6316345A821420!163.entry
【译文】:
Model View Presenter vs Model View Controller
简介
在我工作中经常需要处理一些由于开发人员没能很清楚地理解MVC和MVP模式的区别的情况下使用它们而产生的问题。在这篇文章中我将会阐述一下我对两者之间区别的一些理解。
在N层体系结构中MVC/P模式仅仅只是用于表示层(presentation layer),理解这一点很重要。这两个模式并不是关于怎么构建数据层(data layer)和服务层(service layer)的,而是关于怎么将数据(data)从用户接口(view)中分离出来,以及用户接口如何与数据进行交互的。这些模式的使用让解除你的程序中表示层对对数据和控制逻辑的依赖,从而可以自由的变更表示层。
这两种模式的一般性概念
1、模型(Model)表示数据模型和业务逻辑(business logic)。模型并不总是DataSet,DataTable之类的东西,它代表着一类组件(components)或类(class),这些组件或类可以向外部提供数据,同时也能从外部获取数据并将这些数据存储在某个地方。简单的理解,可以把模型想象成“外观类(facade class)”。译注:这里的外观是指“外观模式”中所说的外观。外观的一般作用是为一个复杂的子系统提供高层次的简单易用的访问接口,可以参看下面的图来理解它的原理:
2、视图(View)将数据层现给用户。一般的视图都只是包含用户界面(UI),而不包含界面逻辑。比如,Asp.net中包含控件的页面(page)就是一个视图。视图可以从模型中读取数据,但是不能修改或更新模型。
3、层现器(Presenter)/控制器(Controller)包含了根据用户在视图中的行为去更新模型的逻辑。视图仅仅只是将用户的行为告知控制器,而控制器负责从视图中取得数据然后发送给模型。
MVC/P模式的核心是为了将模型从视图/控制器中分离出来,从而使得模型独立于它们,因此模型不包含对视图和控制的引用。
什么是MVC(Model View Presenter)模式?
1、为了使得视图接口可以与模型和控制器进行交互,控制器执行一些初始化事件
2、用户通过视图(用户接口)执行一些操作
3、控制器处理用户行为(可以用观察着模式实现)并通知模型进行更新
4、模型引发一些事件,以便将改变发告知视图
5、视图处理模型变更的事件,然后显示新的模型数据
6、用户接口等待用户的进一步操作
这一模式的有一下几个要点:
1、视图并不使用控制器去更新模型。控制器负责处理从视图发送过来的用户操作并通过与模型的交互进行数据的更新
2、控制器可以和视图融合在一块。Visual Studion中对Windows Forms的默认处理方式就是这样的。【译注:比如我们双击一个Button,然后在它的事件里写处理逻辑,然后将处理的数据写回模型中。这里处理逻辑时间应该是控制器的功能,但是我们并没有专门写一个控制器来做这件事情而是接受了VS的默认处理方式,将它写在Form的代码中,而这里的Form在MVC中它就是一个View。所以这说vs默认的处理方式是将把控制器和视图融合在一起的。】
3、控制器不包含对视图的渲染逻辑(rendering logic)
“主动—MVC”模式,也是通常意义下的MVC模式
【译注:为什么说是主动的?View不是等Controller通知它Model更新了然后才从Model取数据并更新显示,而是自己监视Model的更新(如果用观察者模式)或主动询问Model是否更新。前面那种等待Controller通知的方式是下面所介绍的“被动—MVC”的实现方式。】
“被动—MVC”模式
与主动MVC的区别在于:
1、模型对视图和控制器一无所知,它仅仅是被它们使用
2、控制器使用视图,并通知它更新数据显示
3、视图仅仅是在控制器通知它去模型取数据的时候它才这么做(视图并不会订阅或监视模型的更新)
4、控制器负责处理模型数据的变化
5、控制器可以包含对视图的渲染逻辑
MVP模式 与“被动—MVC模式”很接近,区别在于“视图并不使用模型”。在MVP模式中视图和模型是完全分离的,他们通过Presenter进行交互。
Presenter与控制器非常相似,但是它们也有一些的区别:
1、Presenter处理视图发送过来的用户操作(在MVC中视图自己处理了这些操作)
2、它用更新过的数据去更新模型(在被动MVC中控制器只是通知视图去更新过的模型中去取新的数据,而主动MVC中模型通知视图去更新显示,控制器不需要做工作)
3、检查模型的更新(与被动MVC一样)
4、(与MVC的主要区别)从模型中取数据然后将它们发送到视图中
5、(与MVC的主要区别)将所做的更新告知视图
6、(与MVC的区别)用Presenter渲染视图
MVP的优势
1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所以的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
MVP的问题
由于对视图的渲染放在了Presenter中,所以视图和Persenter的交互会过于频繁。
还有一点你需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。
附:
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/MVP.mspx?mfr=true
http://www.codeproject.com/useritems/ModelViewPresenter.asp
分享到:
相关推荐
ASP.NET MVP模式是一种常见的软件设计模式,用于构建可维护性和测试性更强的Web应用程序。MVP代表Model-View-Presenter,它将用户界面(View)与业务逻辑(Model)分离,通过Presenter作为中介进行交互。在ASP.NET...
【基于MVP模式的医疗科普App设计与实现】 ...综合以上特点,基于MVP模式的医疗科普App不仅提供了丰富的科普知识,还通过合理的架构设计保证了系统的可扩展性和可维护性,适应了移动互联网时代信息传播的需求。
本项目是一个基于MVP模式实现的类似微信朋友圈点赞评论的示例,我们可以从中学习到如何在安卓应用中实现实现这些功能。 首先,我们来了解MVP模式的基本结构: 1. Model(模型层):负责处理业务逻辑和数据操作,...
MVP模式有助于提高代码的可测试性和可维护性,降低耦合度。 1. **Model层**:这是业务逻辑的核心部分,负责处理数据。在Android应用中,Model通常与数据源交互,如SQLite数据库、网络API或者是本地文件系统。在这个...
本极简例子旨在帮助开发者理解并掌握如何在Android Studio环境下实现MVP模式。 首先,我们来详细了解MVP模式的三个主要组成部分: 1. **Model(模型)**:这个组件负责与数据源交互,通常包括数据的获取、存储和...
下面将详细阐述MVP模式的各个组成部分及其工作原理。 1. **Model(模型层)** 模型层是应用程序的核心,负责处理业务逻辑和数据管理。它与数据源交互,如数据库、网络API或本地文件系统。模型对象不直接与视图或...
这款名为“Android项目源码MVP模式的一款密码管理应用”的压缩包包含了一个遵循Material Design设计规范的Android应用程序源代码,其主要特点是采用了Model-View-Presenter(MVP)架构模式。MVP是一种软件设计模式,...
总之,Android应用开发中,使用RxJava+Retrofit2.0+MVP模式的整合,能够有效地提升代码质量,优化开发流程,使得复杂项目更易于管理和维护。这不仅提高了开发效率,也为团队协作和长期项目的可持续性奠定了坚实的...
主架构MVP,包含@BindView、DevRing、GreenDao、retrofit2、Dagger2注入、ZLoadingDialog及懒加载等多种知识点实例,实现登录功能,可作为MVP模式基础框架使用,直接在资源里搭建自己的代码即可使用
本资源"安卓登录注册相关-MVP模式实现登录功能.rar"提供了一个使用MVP模式实现登录功能的示例,虽然可能未对所有内容进行验证,但仍然可以作为学习和参考的素材。 首先,我们来了解一下MVP模式的基本结构: 1. **...
1. **MVP模式介绍**: MVP模式是一种软件设计模式,主要用于用户界面的架构。它将业务逻辑、数据处理和用户界面进行了分离,提高了代码的可测试性和可维护性。在MVP中,Model负责处理数据,Presenter作为Model和...
本篇文章将详细阐述MVP框架的核心概念、搭建过程以及相关知识点。 **一、MVP框架概述** MVP框架的主要组成部分包括: 1. **Model(模型)**:负责处理数据和业务逻辑,通常是与数据库、网络API或其他数据源交互的...
在MVP模式中,各个组件有明确的职责划分,有助于实现功能解耦,即每个组件只关注自己的任务,降低了组件间的耦合度。这使得代码更容易理解和维护,同时便于团队协作,因为每个开发者可以专注于他们负责的组件。 **3...
在开源课表项目的实现中,MVP模式能有效提高代码的可测试性、可维护性和模块间的解耦。该项目通过清晰的角色划分,实现了用户界面与业务逻辑的分离,从而提高了开发效率和软件质量。 【详细知识点】 1. **MVP模式...
MVP模式由三个主要组件构成:Model(模型),View(视图)和Presenter(呈现者)。Model负责处理数据和业务逻辑,View负责显示UI,而Presenter作为Model和View的桥梁,处理它们之间的交互。通过这种方式,业务逻辑...
MVP(Model-View-Presenter)架构是一种广泛应用于Android应用开发的设计模式,它将应用程序的逻辑分为三个主要组件:模型(Model)、视图(View)和呈现器(Presenter)。这个框架有助于提高代码的可测试性、可维护...
本项目 "mvp-demo" 是一个开源示例,旨在帮助开发者了解并实践如何使用MVP模式来构建一个展示最近电影的应用。 在MVP模式中,有三个主要角色: 1. **Model**:模型层,负责处理数据。它通常与数据源交互,如数据库...
在Android应用开发中,MVP(Model-View-Presenter)是一种常见的设计模式,它将业务逻辑、用户界面和数据模型分离,使得代码更加模块化,易于测试和维护。本项目"Android MVP项目搭建(MVP+Dagger2+Butterknife)"是...
"qml-mvp-example" 是一个项目名称,表明这是一个关于使用 QML(Qt Quick Markup Language)实现 Model-View-Presenter(MVP)设计模式的示例。MVP 是一种软件架构模式,旨在分离用户界面的逻辑,使代码更易于测试和...
为了解决这些问题,开发者通常会采用MVP(Model-View-Presenter)架构模式以及优化技术,如Adapter和ViewHolder的使用。以下是对这些知识点的详细说明: 1. MVP架构模式: MVP(Model-View-Presenter)是一种设计...