转自:http://www.uml.org.cn/sjms/201006244.asp
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
简介
在我工作中经常需要处理一些由于开发人员没能很清楚地理解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
相关:MVC和MVP的一些思考
相关推荐
**一、MVC模式概述** MVC(Model-View-Controller)设计模式是一种软件设计架构模式,广泛应用于Web应用开发,主要用于分离应用程序的业务逻辑、用户界面和数据管理。该模式将应用程序分为三个核心组件:模型...
MVP模式是一种软件设计模式,其中MVP代表Model-View-Presenter。在Android应用开发中,这种...研究者通过实践证明了MVP模式和响应式网络框架结合使用的可行性和优越性,为今后相关的开发工作提供了理论依据和实践经验。
MVC,MVP 和 MVVM 模式如何选择? 你真的理解了MVC, MVP, MVVM吗? 其中第一篇文章是比较偏理论的分析, 第二篇文章中,在介绍时,包含了一些实际的案例 看完这两篇文章,可以总结如下: 1.1 MVC 1.1.1 类图 1.1.2. 活动...
2. **View**:与MVC中的视图类似,但通常是一个接口,由Activity或Fragment实现,提供显示数据和响应用户事件的方法。 3. **Model**:同样处理数据和业务逻辑,但与Presenter直接交互,而不是视图。 **五、MVC与MVP...
MVP模式将应用程序分为三个部分:Model(数据模型)、View(用户界面)和Presenter(控制器)。这种方式有助于保持代码结构清晰且易于维护。 **示例代码**: ```java // Model public class LoginModel { public ...
书中不仅介绍了JavaScript中经典和现代的设计模式,还包括了针对不同JavaScript开发框架(如MVC、MVP、MVVM)的设计模式,以及最新的模块化JavaScript设计模式(AMD、CommonJS、ES Harmony)和jQuery中的设计模式。...
**MVC模式详解** 在软件开发领域,MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序的设计模式。这个模式将应用程序分为三个主要部分,每个部分都有明确的责任,从而提高了代码的可维护性和可扩展性。...
MVC MVP MVVM 架构详细图 将应用程序划分为三种组件,模型 - 视图 - 控制器(MVC)设计定义它们之间的相互作用。[2] 模型(Model) 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“ Model ”有对...
首先,让我们详细探讨MVP模式。MVP是用户界面(UI)设计的一个流行架构,它将UI分为三个主要组件: 1. **Model**:这是应用程序的数据模型,负责存储和管理数据。它不直接与视图或呈现器交互,而是通过接口提供数据...
在实际案例部分,作者可能会展示如何在Android应用中有效运用这些设计模式,比如如何利用MVC、MVVM或MVP架构模式来组织代码,如何使用装饰者模式来扩展功能,或者如何利用代理模式实现动态权限控制等。这些实战经验...
2. **创建第一个ASP.NET Core项目**:讲解如何使用模板创建一个新的ASP.NET Core Web应用,包括MVC(Model-View-Controller)模式的介绍。 3. **控制器和动作**:理解控制器的角色,如何编写动作方法处理HTTP请求,...
本书获得了来自业界专家的广泛赞誉,如Microsoft MVP Alessandro Gallo称赞其为权威的ASP.NET MVC2来源,而Derek Jackson则认为它是宝贵的学习与参考读物。本书不仅由参与塑造MVC框架的人撰写,还教授了有助于开发者...
5. **模块化与架构设计**:书中可能还会探讨模块化设计原则,如服务化、微服务架构、模块间通信方式(如API Gateway、事件驱动等),以及如何利用MVC、MVP、MVVM等架构模式来组织复杂的业务逻辑。 6. **设计模式的...
+ MVC 模式 + MVP 模式 + MVVM 模式 + other 第三单元:软件项目管理与流程 * 软件项目管理 + 软件项目管理的基本概念 + 软件项目管理的流程 + 软件项目管理的工具 * 软件项目流程 + 软件项目流程的基本...
七、MVC、MVP、MVVM模式 这三种架构模式在Android开发中各有优势。MVC适合小型项目,MVP适用于中大型项目,而MVVM则强调数据绑定和解耦。书中将详细分析每种模式的优缺点及适用场景,指导开发者选择合适的架构。 八...
13. **设计模式与架构**:如单例模式、工厂模式、依赖注入、三层架构、MVP模式等,它们在ASP.NET开发中的应用。 以上只是部分可能涵盖的ASP.NET面试知识点,实际面试中还会涉及更多的技术和实践问题。准备面试时,...
2. **Web Forms和MVC模式**:ASP.NET支持两种主要的开发模式:Web Forms和MVC。考虑到这是一个图书销售管理系统,可能是基于Web Forms构建,因为它提供了一种声明式编程模型,适合快速开发。不过,也有可能采用了MVC...
二是在了解Android平台框架开发技术的基础上进行改进与创新,常见框架技术包括MVC、MVP、MVVM等;三是掌握Android平台先进的数据存储技术,区分内部存储和外部存储,以满足应用在数据管理上的需求。 移动APP开发的...
- MVC、MVP、MVVM架构模式的理解与应用,特别是MVVM中的LiveData和ViewModel。 - 单例模式、工厂模式、代理模式等在Android中的实践。 10. **Jetpack组件**: - Room数据库的使用,了解其与SQLite的集成和ORM...