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的区别浅析
相关文章
相关标签/搜索