MVP MVVM MVC

上一篇獲得你們的關注,很是感謝。因爲本身對於這些模式的理解也是有限,對於MVC,MVP,MVVM這些模式的比較,是結合本身的理解,一些地方不必定準確,須要的朋友能夠參考下




 
上一篇獲得你們的關注,很是感謝。因爲本身對於這些模式的理解也是有限,對於這些模式的比較,是結合本身的理解,一些地方不必定準確,可是隻有亮出本身的觀點,才能拋磚引玉不是? 歡迎各位拍磚。:)


複製代碼 代碼以下:


閱讀目錄:

四. MVP模式

     4.1 MVP的思想

     4.2 UI界面接口化

     4.3 Presenter —— Model和View之間的橋樑

     4.4 MVP的代碼結構和時序圖

     4.5 MVP模式總結

五. MVVM模式

     5.1 MVVM模式的設計思想

     5.2 MVVM模式結構圖

六. MVC, MVP和MVVM模式使用場景總結



四, MVP模式

MVP模式也是一種經典的界面模式。MVP中的M表明Model, V是View, P是Presenter。
下面例子中的完整代碼,能夠在這裏下載:  WinformMVP源碼
你們還能夠比較這篇文章 淺析MVP模式中V-P交互問題及案例分享

4.1 MVP的思想
MVP模式在我看來,是一個真正意義上的隔離View的細節和複雜性的模式。爲何這麼說:
由於在其它模式中V都表明的是UI界面, 是一個html頁面,XAML文件或者winform界面。可是在MVP模式中的V表明的是一個接口,一個將UI界面提煉而抽象出來的接口。接口意味着任何實現了該接口的界面,都可以複用已有的Presenter和Model代碼。

4.2 UI界面接口化
要很好的理解MVP, 就要有把UI界面接口化的能力。看下面的界面中,將紅色標記的User Control抽象一下,就能獲得下面的接口



 
  



複製代碼 代碼以下:


public interface IUserAdd 
{ 
       event EventHandler UserAddEvent;
       string UserName { get; set; }
       string UserAge { get; set; }
}



界面中的2個輸入框被抽象成了UserName和UserAge兩個屬性。Save按鈕的點擊事件,被抽象成了事件UserAddEvent。winform中實現該接口的代碼以下:


複製代碼 代碼以下:


public partial class UserAdd : UserControl, IUserAdd 
{ 
       public event EventHandler UserAddEvent; 
       public string UserName 
       { 
           set { this.txbName.Text = value; } 
           get { return this.txbName.Text; } 
       }

       public string UserAge 
       { 
           set { this.txbAge.Text = value; } 
           get { return this.txbAge.Text; } 
       }

       public UserAdd() 
       { 
           InitializeComponent(); 
       }

       private void btnAdd_Click(object sender, EventArgs e) 
       { 
          if (UserAddEvent != null) UserAddEvent(this, e); 
       } 
   }



下面拿UserAge屬性來解釋一下,UI界面接口化的魔力。當後端代碼要獲取界面上的年齡值,就只須要get屬性, 要更新界面顯示的時候,就只須要set屬性。
這個時候,後端代碼對於界面的操做,被抽象成了對於UserAge屬性的操做了,也就是和具體的界面顯示無關了。

4.3 Presenter —— Model和View之間的橋樑
上文提到的後端代碼中,包含了P和M. M和MVC中同樣,指的是邏輯代碼。P則是Model和View之間的橋樑,負責將對應的Model和View組合到一塊兒。

針對上面的IUserAdd, 對應的Presenter代碼是:


複製代碼 代碼以下:


public class UserAddPresenter:IPresenter 
{ 
       private readonly IUser _model; 
       private readonly IUserAdd _view; 
       private readonly ApplicationFacade _facade = ApplicationFacade.Instance; //這裏的facade是Presenter之間通訊用的,詳細能夠看完整代碼

      //Presenter構造函數中,將view和model做爲參數傳入

       public UserAddPresenter(IUser model, IUserAdd view) 
       { 
           _model = model; 
           _view = view; 
           WireUpViewEvents(); 
       }

       private void WireUpViewEvents() 
       { 
           _view.UserAddEvent += _view_UserAdd; 
       }

      //當view的UserAdd事件觸發,取得UI中的數據,調用model邏輯處理,添加新用戶。
     //同時發送User_ADDED消息到系統中(系統中其它UI部分接收消息,好比這裏的DataGrid,它接收到User_ADDED以後,會刷新)
       private void _view_UserAdd(object sender, EventArgs e) 
       { 
           var user = new User 
                      { 
                          Name = _view.UserName, 
                          Age = Convert.ToInt32(_view.UserAge) 
                      };
           _model.AddItem(user); 
           _facade.SendNotification(ApplicationFacade.USER_ADDED); 
       }
}



4.4 MVP的代碼結構和時序圖
這裏的MVP中的代碼結構圖和時序圖,可以更好的幫助理解MVP模式





4.5 MVP模式總結
在MVP裏,Presenter徹底把Model和View進行了分離,主要的程序邏輯在Presenter裏實現。並且,Presenter與具體的 View是沒有直接關聯的,而是經過定義好的接口進行交互,從而使得在變動View時候能夠保持Presenter的不變,即重用! 不只如此,咱們還能夠編寫測試用的View,模擬用戶的各類操做,從而實現對Presenter的測試 —— 而不須要使用自動化的測試工具。 咱們甚至能夠在Model和View都沒有完成時候,就能夠經過編寫Mock Object(即實現了Model和View的接口,但沒有具體的內容的)來測試Presenter的邏輯。

MVP的優點

一、模型與視圖徹底分離,咱們能夠修改視圖而不影響模型 
二、能夠更高效地使用模型,由於全部的交互都發生在一個地方——Presenter內部 
三、咱們能夠將一個Presener用於多個視圖,而不須要改變Presenter的邏輯。這個特性很是的有用,由於視圖的變化老是比模型的變化頻繁。 
四、若是咱們把邏輯放在Presenter中,那麼咱們就能夠脫離用戶界面來測試這些邏輯(單元測試)

五, MVVM模式

5.1 MVVM模式的設計思想
MVVM模式中,一個ViewModel和一個View匹配,它沒有MVP中的IView接口,而是徹底的和View綁定,全部View中的修改變化,都會自動更新到ViewModel中,同時ViewModel的任何變化也會自動同步到View上顯示。

這種自動同步之因此可以的緣由是ViewModel中的屬性都實現了observable這樣的接口,也就是說當使用屬性的set的方法,都會同時觸發屬性修改的事件,使綁定的UI自動刷新。(在WPF中,這個observable接口是 INotifyPropertyChanged; 在knockoutjs中,是經過函數ko.observable() 和ko.observrableCollection()來實現的)

因此MVVM比MVP更升級一步,在MVP中,V是接口IView, 解決對於界面UI的耦合; 而MVVM乾脆直接使用ViewModel和UI無縫結合, ViewModel直接就能表明UI. 可是MVVM作到這點是要依賴具體的平臺和技術實現的,好比WPF和knockoutjs, 這也就是爲何ViewModel不須要實現接口的緣由,由於對於具體平臺和技術的依賴,本質上使用MVVM模式就是不能替換UI的使用平臺的.

5.2 MVVM模式結構圖
這裏是MVVM模式的結構圖,可以幫助更加容易的理解MVVM模式:



六, MVC, MVP和MVVM模式使用場景總結

因爲在winform中沒法像WPF同樣,支持數據和界面的雙向綁定以及事件的監控,因此,在winform中MVP是最佳選擇。
WPF和html界面中使用Knockout,實現了observable, 因此使用MVVM.(應該說WPF就是爲使用MVVM設計的)
在web應用中,因爲http是基於請求和響應方式協同工做的, 沒法一直保持鏈接狀態,因此沒法達到MVP中Presenter之間的消息傳遞和MVVM中的ViewModel和界面之間的綁定, 因此MVC是最佳的選擇。

 

您可能感興趣的文章:
ASP.NET小結之MVC, MVP, MVVM比較以及區別(一)
asp.net中virtual和abstract的區別分析
Asp.net中Response.Charset與Response.ContentEncoding區別示例分析
c#.net中const和readonly的區別
詳細說明asp.net中datareader 和 dataset 的區別
asp.net中DBNull.Value,null,String.Empty區別淺析
asp.net 中靜態方法和動態方法調用的區別實例分析
.net中as和is之間的區別分析
ASP.NET筆記之 控件與母板的區別分析
.net中的session與cookies區別及使用方法
.NET MVC中ViewData,ViewBag和TempData的區別淺析
相關文章
相關標籤/搜索