MVC、MVP和MVVM都是软件工程中的架构模式,都是用来解决界面呈现和逻辑代码分离而出现的模式,在具体的软件工程中选择哪一个呢?
1、MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,MVC分为以下几种模式。
这里的主动的意思是,Model会主动通知View更新。而我们使用MVC框架, Struts, asp.net mvc等都不是主动MVC(视图的更新都是通过Controller完成的)Model用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制那些用于监视此模型的视图必须事先在此模型上注册,从而视图可以了解在数据模型上发生的改变。View视图层负责数据的展示。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里订阅Model的事件。Controller控制器是M和V之间的连接器,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。
1.2、被动MVC
被动MVC 与主动MVC的区别在于: 1. 模型对视图和控制器一无所知,它仅仅是被它们使用 2. 控制器使用视图,并通知它更新数据显示 3. 视图仅仅是在控制器通知它去模型取数据的时候它才这么做(视图并不会订阅或监视模型的更新)
1.3、Web应用中的MVC
Web中的MVC框架大部分都是被动MVC模式,小部分是主动MVC,因为web应用中http是基于请求和响应方式协同工作的,因此当服务器端的model(数据)发生变化时,它不会立即更新客户端的view,只有客户端重新请求或刷新页面时才更新。
MVC模式特点:
MVC很好的分离了视图层和业务层,所以它具有耦合性低,开发速度快,可维护性高 ,没有控件的特点,对html没有封装,比较易于理解和其它平台(java, php)等更加兼容。
2、MVP模式
MVP模式也是一种经典的界面模式。MVP中的M代表Model, V是View, P是Presenter, MVP模式是一个真正意义上的隔离View的细节和复杂性的模式。因为在其它模式中V都代表的是UI界面, 是一个html页面,XAML文件或者winform界面。但是在MVP模式中的V代表的是一个接口,一个将UI界面提炼而抽象出来的接口。接口意味着任何实现了该接口的界面,都能够复用已有的Presenter和Model代码,P则是Model和View之间的桥梁,负责将对应的Model和View组合到一起。
在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的 View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变即可重新使用,不仅如此我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试 —— 而不需要使用自动化的测试工具,甚至可以在Model和View都没有完成时候,就可以通过编写Mock Object来测试逻辑单元。
3、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。
由于在winform中无法像WPF一样,支持数据和界面的双向绑定以及事件的监控,所以在winform中MVP是最佳选择。在WPF和html应用中使用Knockout可以实现了observable, 所以使用MVVM是最佳选择。在WEB应用中由于HTTP是基于请求和响应方式协同工作的, 无法一直保持连接状态,无法达到MVP中Presenter之间的消息传递和MVVM中的ViewModel和界面之间的绑定, 所以使用MVC是最佳的选择。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!