1. 程式人生 > >淺析MVP(Model-View-Presenter)架構及開發模式

淺析MVP(Model-View-Presenter)架構及開發模式

一、概述

    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。

二、優缺點
    
針對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充當檢視和業務邏輯的緩衝層。

三、MVP與MVC的區別
    
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頁只用於新增使用者控制元件,因此只需要將使用者控制元件拖拽到頁面上可以很容易的重用。

<span style="font-family:Microsoft YaHei;font-size:18px;">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);
}</span>

    通過上面的程式碼就可以瞭解到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)。自從來到部落格園裡不斷學習,不斷借鑑,豐富了自己的知識。在這裡的MVP,我想同樣應該實用於開發Windows軟體專案。這篇文章寫的比較倉促,難免有誤之處,同時我也在不斷的挖掘MVP的更深層次的應用。在這裡這是我個人的理解,希望高人點評指點,若您有其他的理解,可以與我共同探討。希望大家一起學習,共同進步。