`

MVP模式与MVC模式

 
阅读更多

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

分享到:
评论

相关推荐

    MVP模式与mvc

    ### MVP模式与MVC模式详解 #### 一、MVP模式简介 MVP(Model-View-Presenter)模式是一种软件架构设计模式,主要用于构建用户界面。它是从经典的MVC(Model-View-Controller)模式演变而来的。MVP模式的核心在于它...

    浅谈三大模式(mvc,mvp,mvvm)

    首先,我们来理解MVC模式。Model代表应用程序的数据模型,负责存储和管理数据;View是用户界面,用于展示数据;Controller作为两者之间的桥梁,处理用户输入并更新Model,同时更新View以反映Model的变化。MVC的优势...

    MVC和MVP模式项目实现

    然后,MVP模式是MVC模式的一个变种,特别适用于Android和Web开发。在MVP模式中: 1. **Model(模型)**:同MVC,仍然是负责数据和业务逻辑的部分。 2. **View(视图)**:负责显示数据和接收用户输入,但不直接操作...

    Android学习之浅谈对MVC模式和MVP模式的理解

    首先,我们来了解一下MVC模式。MVC是一种软件设计模式,主要用于分离应用程序的业务逻辑(Model)、用户界面(View)和控制逻辑(Controller)。Model负责数据的处理和存储,View负责数据显示,而Controller作为桥梁...

    MVC和MVP深度对比

    3. **可测试性**:由于presenter与视图解耦,MVP模式更适合单元测试,而MVC在这方面相对较弱。 4. **代码量**:MVP通常会产生更多的代码,因为presenter需要实现视图接口并进行大量的数据转换。 5. **性能**:在大型...

    Android MVP和MVC模式比较Demo

    MVP模式强调了Presenter作为业务逻辑处理者,使得View更专注于UI展示,而MVC模式中Controller承担了更多的职责。在实际项目中,开发者应根据项目需求和团队习惯选择适合的架构模式。同时,对异步请求的合理封装也是...

    android中的mvc与mvp模式的小demo

    MVC模式是一种软件设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种分离使得各部分职责明确,易于维护和扩展。 - **模型(Model)**:负责处理业务逻辑和数据...

    设计模式学习:Model View Presenter (MVP) mvc mvp

    MVC模式的优势在于分离关注点,使得每个部分都可以独立修改和测试,但随着项目规模的增大,Controller可能会变得过于复杂。 **MVP模式** MVP(Model-View-Presenter)模式是MVC的一种变体,它强调了Presenter的...

    MVP与MVC的区别

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示.

    MVC与MVP与MVVM.pdf

    在MVP模式中,由于视图不依赖于模型,因此可以进行组件化,视图可以作为高度可复用的组件从特定的业务场景中脱离出来。 然而,MVP模式也有其缺点。 Presenter中除了业务逻辑以外,还有大量的视图到模型,模型到视图...

    Android MVP设计模式 实战演练

    本实战演练将深入探讨如何在Android项目中运用MVP模式来构建高效、模块化的应用。 **1. MVP模式的组件解释** - **Model(模型层)**: 这是业务逻辑和数据处理的部分,负责与数据源交互,如数据库、网络API等。它不...

    几张图看明白MVC MVP MVVM

    在MVC模式中,各部分之间的通信过程是这样的:首先视图发送指令给控制器,然后控制器处理业务逻辑后向模型发出请求,模型状态更新后将新的数据返回给控制器,最后控制器再将新数据送到视图,用户得到反馈。...

    MVC与MVP代码实现在android上

    **MVC模式** MVC是一种将应用程序分为三个主要部分的架构模式: 1. **Model(模型)**:模型层负责处理数据和业务逻辑。它包含了应用的数据模型和数据访问对象(DAO)。当数据发生变化时,模型会通知视图进行更新...

    MVC和MVP的区别

    **MVC(Model-View-Controller)模式与MVP(Model-View-Presenter)模式是两种常见的软件架构设计模式,主要用于构建用户界面。这两种模式在软件开发中扮演着至关重要的角色,帮助开发者组织代码,提高代码的可维护...

    QT实现Mvp设计模式Demo

    MVP是由MVC发展而来,总体目的与作用相同。都是为了软件构架有层次之分,使得核心逻辑、界面控制、数据这三者分层清晰明了。减少了三者之间的逻辑耦合与功能耦合。也是的代码清晰易读。从而减少因写代码造成的bug。...

    mvp-mvc_demo

    3. **复杂性**:MVP模式增加了Presenter层,导致组件数量增加,可能使项目结构稍显复杂,尤其是大型项目。 4. **代码量**:MVP通常需要编写更多代码,因为每个View都需要对应的Presenter,而MVC中Controller可以处理...

    MVC设计模式详解

    随着技术的发展,MVC模式也出现了许多变种和扩展,如MVVM(Model-View-ViewModel)、 MVP(Model-View-Presenter)等,它们在保持基本原理的同时,针对不同的应用场景进行了优化。 **六、总结** MVC设计模式是软件...

Global site tag (gtag.js) - Google Analytics