zoukankan      html  css  js  c++  java
  • MVC与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。

    处理流程

    对于处理流程方面两者的区别,用下面这两幅图就可以说明一切:

     

    图1:Model-View-Controller

     

    图2:Model-View-Presenter

    处理流程方面,在MVC中,用户的请求首先会到达Controller,由Controller从Model获取数据,选择合适的View,把处理结果呈现到View上;在MVP中,用户的请求首先会到达View,View传递请求到特定的Presenter,Presenter从Model获取数据后,再把处理结果通过接口传递到View。

    View区别

    ASP.NET MVC Framework中的View可以是一个ASP.NET页面、用户控件或者是母版页。需要分别s继承于ViewPage、ViewUserControl、ViewMasterPage。示例代码:

    public partial class Views_Blog_New : ViewPage{    }

    采用行内代码进行数据的呈现,当然也可以使用服务器控件,示例代码:

    <h2>ASP.NET MVC Framework Sample</h2><hr /><%=Html.ActionLink("Home", "Index")%> |<%=Html.ActionLink("New Post", "New")%><div>    <%foreach (Post post in ViewData)      { %>    <div class="postitem">        <strong>Title</strong><%=Html.Encode(post.Title) %></br>        <strong>Author</strong><%=Html.Encode(post.Author) %></br>        <strong>PubDate</strong><%=Html.Encode(post.PubDate.ToShortDateString()) %></br>        <strong>Content</strong><%=Html.Encode(post.Description) %></br>        <%=Html.ActionLink("Edit", new {action="Edit", Id=post.Id })%>    </div><br />    <% } %></div>

    在MVP中,仍然采用WebForm模型,其中View分为View接口和View实现两部分,实现部分可以是ASP.NET页面、用户控件或者母版页:

    public interface IProductDetail{    string Name { set;}    string Brand { set;}}
    public partial class Products_ProductDetail : Page, IProductDetail{}

    使用服务器控件进行呈现(也可以是HTML控件):

    <asp:Content ID="content" ContentPlaceHolderID="DefaultContent" Runat="Server">    <h1>ProductDetail</h1>    <p>名称:<asp:Label ID="lbl_Name" runat="server" Text=""></asp:Label></p>    <p>品牌:<asp:Label ID="lbl_Brand" runat="server" Text=""></asp:Label></p>  </asp:Content>

    Controller和Presenter

    ASP.NET MVC Framework中,一个View在整个应用程序中可以被多个Controller所调用。

    public class PostController : Controller{    [ControllerAction]    public void New()    {        RenderView("New");    }}public class BlogController : Controller{    [ControllerAction]    public void New()    {         RenderView("New");    }}

    MVP中一个View在整个应用程序中只对应一个特定的Presenter:

    public partial class Products_ProductDetail : Page, IProductDetail{    private ProductDetailPresenter _presenter;    protected void Page_Load(object sender, EventArgs e)    {        if (!this.IsPostBack)        {            this._presenter.OnViewInitialized();        }        this._presenter.OnViewLoaded();    }    [CreateNew]    public ProductDetailPresenter Presenter    {        set        {            this._presenter = value;            this._presenter.View = this;        }    }}

    对开发过程的影响

    在ASP.NET MVC Framework中,采用行内代码进行数据呈现,逻辑集中在Controller中,但是View无法完全交给UI设计人员完成。在MVP模式中,所有的业务逻辑交给Presenter去处理,这样View中代码就变得及其简洁,将可以轻易的把开发人员和UI设计人员分开,如下图所示:

     

    对单元测试的支持

    在单元测试方面的支持,ASP.NET MVC Framework在出现的时候就讲促进清晰的关注分离,可测试性和TDD。MVC Framewrok中的所以核心契约都是基于接口的,可以轻易地通过Mock来模拟。可以不用在ASP.NET进程中运行控制器,就能进行单元测试。同时可以使用你想使用的任何单元测试框架来做单元测试,包括NUnit, MBUnit, MS Test等等。

    MVP模式的出现,在一定程度上是为了便于UI的单元测试。由于所有的处理都放在了Presenter中,View中的代码变得及其干净简单,所以可以很方便的进行单元测试,Web Client Software Factory中,提供了自动化项目指导包,可以直接创建测试项目。

    结束语

    对于ASP.NET MVC Framework和WCSF中的MVP模式之小小比较,到这里就结束了,不管是ASP.NET MVC Framework还是WCSF中的MVP模式,都是非常优秀的模型,值得我们更进一步去研究。

  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/huyinyang/p/2524949.html
Copyright © 2011-2022 走看看