Model-View-Presenter(MVP)概述
    
MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成为.NET社区的热名话题。作为MVC的变种MVP模式,也已经出现好几年了,在微软模式与实践小组提供的Web Client Software Factory中,给出了实现MVP模式的应用程序最佳实践,本文将试着对这两种实现比较一二。
MVC(Model-View-Controller,模型-视图-控制器)模式是80年代Smalltalk-80出现的一种软件设计模式,后来得到了广泛的应用,其主要目的在于促进应用中模型,视图,控制器间的关注的清晰分离。MVP(Model-View-Presenter,模型-视图-表示器)模式则是由IBM开发出来的一个针对C++和Java的编程模型,大概出现于2000年,是MVC模式的一个变种,主要用来隔离UI、UI逻辑和业务逻辑、数据。在下面的文字中,如无特别说明,MVC均指ASP.NET MVC Framework。

Model-View-Presenter(MVP)优缺点
    
针对ASP.NET MVP Sample实例,在这个实例中MVP模式采用了Castle框架和底层数据映射NHibernate框架,在开发过程中要注意NHibernate的版本的不同,有的支持sql server 2000,有的支持sql server 2005数据库。IHttpModule接口的实现。其实在使用Castle框架时,IContainerAccessor接口已经封装了IoC模式。还有泛型编程。事务回滚操作。在编程过程中,你可以保留它现有的模式,也可以增加或改变其模式。
    Model-view-presenter旨在应用程序分层和提高测试效率,它的主要目标是将显示逻辑与业务逻辑分离,正如我们设计面向对象程序中创建松散耦合并可重用的对象。
    MVP的另一个目标是提高针对View的测试效率。编写依赖Session, ViewState, AJAX, HTML或web控件和业务实体的单元测试类较为复杂,因此我们将各视图的显示逻辑保留在ASPX/ASCX文件类中,并将业务逻辑从中分离出来放在相应的类中,在MVP中Presenter充当视图和业务逻辑的缓冲层。

MVPMVC的区别
    
MVP——Model-View-Presenter 它是MVC模式的变种。UI是容易变化的,且是多样的,一样的数据会有N种显示方式;业务逻辑也是比较容易变化的。为了使得Application具有较大的弹性,我们期望将UI、逻辑(UI的逻辑和业务逻辑)和数据隔离开来,而MVP是一个很好的选择。
    Presenter代替了Controller,它比Controller担当更多的任务,也更加复杂。Presenter处理事件,执行相应的逻辑,这些逻辑映射到Model的Command以操作Model。那些处理UI如何工作的代码基本上都位于Presenter。Presenter如同一个乐队的指挥家,表现和协调整个Application,它负责创建和协调其它对象。
    Model和View使用Observer模式进行沟通;而Presenter和View则使用Mediator模式进行通信;Presenter操作Model则使用Command模式来进行。基本设计和MVC相同:Model存储数据,View表示Model的表现,Presenter协调两者之间的通信。在 MVP 中 View 接收到事件,然后会将它们传递到 Presenter, 如何具体处理这些事件,将由 Presenter 来完成。

图1:Model-View-Controller

图2:Model-View-Presenter
处理流程方面,在MVC中,用户的请求首先会到达Controller,有Controller从Model获取数据,选择合适的View,把处理结果呈现到View上;在MVP中,用户的请求首先会到达View,View传递请求到特定的Presenter,Presenter从Model获取数据后,再把处理结果通过接口传递到View。
使用MVP后,我们可以提高对Model和Presenter的复用,比如可以对Model和Presenter不做修改,而能提供ASP.NET Web Form和 Windows Form。
在ASP.NET MVC Framework中,采用行内代码进行数据呈现,逻辑集中在Controller中,但是View无法完全交给UI设计人员完成。在MVP模式中,所有的业务逻辑交给Presenter去处理,这样View中代码就变得及其简洁,将可以轻易的把开发人员和UI设计人员分开,如下图所示:

MVP实例讲解
  
下面看一个简单的例子:
  该方式将创建Presenter,传递View和model,调用“InitView”方法的功能交给ASCX用户控件(View)处理。View应用相应的Presenter,Presenter只知道View的接口。ASPX页只用于添加用户控件,因此只需要将用户控件拖拽到页面上可以很容易的重用。

public class Presenter
{
    public Presenter(IView view, IModel model)
     {        
        this.view = view;
        this.model = model;
    }

    public void InitView(bool isPostBack)
     {
        if(!isPostBack)
         {
            view.SetProducts(model.GetProducts());
        }
    }
    
    public void SaveProducts(IList<IProduct> products)
     {
        model.SaveProducts(products);
    }
}

//页面或用户控件CS代码
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    presenter = new Presenter(this,model);
    presenter.InitView(Page.IsPostBack);
}

public void SetProducts(IList<IProduct> products)
{
    //bind products to view
}

//视图接口
public interface IView
{
    void SetProducts(IList<IProduct> products);
}

通过上面的代码就可以了解到MVP的结构是什么样的,可根据这种模式来开发你的项目。当然你也可以从codeplex网站上下载一个Demo,进一步理解。希望这篇文章能对大家有用。

企业级MVP架构的应用
  
在企业级ASP.NET应用中使用MVP 
1、使用用户控件封装Views:这个主题讨论用户控件作为MVP中的View。
2、MVP的事件处理:这个主题讨论连同页面验证传递事件到Presenter,IsPostBack和将消息传递到View。
3、MVP和PageMethods的页面重定向:这个主题讨论使用用户控件作为View,如何使用PageMethods处理页面重定向。
4、MVP的Presentation安全控制:这个主题讨论如何根据基本的安全限制显示/掩藏View中的区段。
5、使用MVP的应用的架构(高级):这是个重点,这个主题展示一个使用Nhibernate作为数据访问层的MVP应用。

Codeplex网站上的那个例子,含概的内容不少,大家可以下载下来分析。

MVP工作感言
 
   这次写这篇文章,主要是解读MVP框架,针对微软MVP的一个例子讲解所涉及到的一些应用模式。最近公司项目采用了MVP架构来开发,对我来说有颇多收获和感慨。对于MVP模式来开发,应当算是新的架构,因为之前只知道微软MVP(Microsoft Most Valuable Professional),并不知道MVP(Model-View-Presenter)。自从来到博客园里不断学习,不断借鉴,丰富了自己的知识。在此要感谢drummery和ξ箫音ξ两位老师的文章,同时也借鉴了UML软件工程组织网站的文章。MVP模式开发项目,我想未来几年将会越来越被许多人使用开发项目。在这里的MVP,我想同样应该实用于开发Windows软件项目。这篇文章写的比较仓促,难免有误之处,同时我也在不断的挖掘MVP的更深层次的应用。在这里这是我个人的理解,希望高人点评指点,若您有其他的理解,可以与我共同探讨。希望大家一起学习,共同进步。

MVP架构。。。。的更多相关文章

  1. 转:Android官方MVP架构示例项目解析

    转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...

  2. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  3. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  4. Android MVP架构分析

    App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...

  5. 设计模式笔记之二:Android开发中的MVP架构(转)

    写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...

  6. mvp架构解析

    MVP现在已经是目前最火的架构,很多的框架都是以MVP为基础,甚至于Google自己都出一个MVP的开源架构.https://github.com/googlesamples/android-arch ...

  7. 用户登录(Material Design + Data-Binding + MVP架构模式)实现

    转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...

  8. MVP架构

    一.介绍 MVP(Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.对于在Android应用中开发就可以视为是MVC架构,布局 ...

  9. MVP架构在xamarin android中的简单使用

    好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...

随机推荐

  1. mathematics

    二倍角公式 史济怀-数学分析1-2003-09-19_2.asx-在线播放-优酷网,视频高清在线观看http://v.youku.com/v_show/id_XMTMzMDU1MTgw.html 国立 ...

  2. 【CITE】C# 如何 实现一个窗体和另一个窗体始终保持相对的位置

    C# 如何 实现一个窗体和另一个窗体始终保持相对的位置,任由一个窗体移动,当点击按钮时,弹出的另一个窗体也与之保持相对位置(如左上角)你根据第一个窗体的location去算第二个窗体的location ...

  3. spring来了-01-概述

    思考 对象创建能否写死? 对象创建细节 对象数量 action       多个    [需要维护成员变量] service      一个    [不需要维护成员变量] dao           ...

  4. Growing转化的每一步(笔记整理)

    渠道流量监控中,如何将劣质流量和优质流量区分开来? 劣质流量总会有有一些不同于其他正常渠道的特征,比如在同一个时间中大量集中访问.使用的硬件设备比较固定.使用特定的浏览器等. 实际案例:去年有一些 A ...

  5. X-UniTMX:导入大型Tiled地图文件(*.tmx)到Unity3d中比较好的插件

    因工作原因,需要导入格子数为1200x1200的Tiled地图文件(*.tmx)到Unity3d中显示出来.尝试过一些其它插件,后面发现X-UniTMX是比较好用的. X-UniTMXhttp://f ...

  6. Java并发编程:阻塞队列(转载)

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  7. 转:Struts2<s:iterator value="" var="lst">中var的使用和一些标签的使用体会

    比如<s:iterator value="pmOperateList" var="lst"> <!-- iterator加上var 等价于重新 ...

  8. C++实现对树的创建和前中后序遍历

    #include<iostream>#include<stdio.h> using namespace std; class BitNode{ public: char dat ...

  9. ORACLE数据泵还原(IMPDP命令)【转】

      Oracle数据库还原IMPDP命令是相对于EXPDP命令的,方向是反向的.即对于数据库备份进行还原操作.一.知晓IMPDP命令 ? C:\>impdp -help Import: Rele ...

  10. 解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题

    解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题 在web.xml中添加如 ...