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。web
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充當視圖和業務邏輯的緩衝層。sql
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頁只用於添加用戶控件,所以只須要將用戶控件拖拽到頁面上能夠很容易的重用。安全
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
一、使用用戶控件封裝Views:這個主題討論用戶控件做爲MVP中的View。
二、MVP的事件處理:這個主題討論連同頁面驗證傳遞事件到Presenter,IsPostBack和將消息傳遞到View。
三、MVP和PageMethods的頁面重定向:這個主題討論使用用戶控件做爲View,如何使用PageMethods處理頁面重定向。
四、MVP的Presentation安全控制:這個主題討論如何根據基本的安全限制顯示/掩藏View中的區段。
五、使用MVP的應用的架構(高級):這是個重點,這個主題展現一個使用Nhibernate做爲數據訪問層的MVP應用。框架
Codeplex網站上的那個例子,含概的內容很多,你們能夠下載下來分析。ide
MVP工做感言
此次寫這篇文章,主要是解讀MVP框架,針對微軟MVP的一個例子講解所涉及到的一些應用模式。最近公司項目採用了MVP架構來開發,對我來講有頗多收穫和感慨。對於MVP模式來開發,應當算是新的架構,由於以前只知道微軟MVP(Microsoft Most Valuable Professional),並不知道MVP(Model-View-Presenter)。自歷來到博客園裏不斷學習,不斷借鑑,豐富了本身的知識。在此要感謝drummery和ξ簫音ξ兩位老師的文章,同時也借鑑了UML軟件工程組織網站的文章。MVP模式開發項目,我想將來幾年將會愈來愈被許多人使用開發項目。在這裏的MVP,我想一樣應該實用於開發Windows軟件項目。這篇文章寫的比較倉促,不免有誤之處,同時我也在不斷的挖掘MVP的更深層次的應用。在這裏這是我我的的理解,但願高人點評指點,若您有其餘的理解,能夠與我共同探討。但願你們一塊兒學習,共同進步。單元測試