上一篇獲得你們的關注,很是感謝。因爲本身對於這些模式的理解也是有限,對於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的區別淺析