MVC
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,M表示Model(模型),包含着数据,以及和这些数据相关的逻辑和运算;C表示View(视图),表示用户能够直接看到的界面;C(Controller)表示控制器,用来协调模型和视图,可以作为视图和模型进行通信的通道,也能够负责一定的逻辑和运算。
使用MVC的一个主要目的,就是为了将项目的业务逻辑层和视图层分开。
相比于不使用MVC,使用MVC的优点是:
1.可以将项目进行比较清晰的分工,让大家都知道各自的职责
2.容易进行测试(因为分工清晰)
3.维护成本低
传统的MVC如下图所示:
在这种情况下,view可以不经过controller而直接访问model,所以导致view和model的耦合性很高。另外,view里面也会有一些逻辑和运算,view就会变得比较厚,不利于任务的均摊。
MVP
1996年,Taligent公司的CTO,Mike Potel在一篇论文中提出Model-View-Presenter的概念。
刚开始的时候,MVP应该是仅仅是使用Presenter(主持者),在MVC的基础上,来对MVC中的Controller做了进一步的规范,如下图所示:
但是现在我所理解的MVP,应该是如下如所示:
在这样的情况下,view和model彻底分离了。如果view和model要进行通信,必须要经过presenter。同时,所有的逻辑和运算,都可以放到presenter里面,从而减轻了view的负担。
此时,由于view和model彻底分离,所以在修改view的时候不用管model,在修改model的时候也不用管view,这样进行修改的时候很方便。
同时,由于view中已经没有了逻辑和运算功能,逻辑和运算功能都放在presenter里面,所以一个presenter可以对应多个view,大大增加了重用性。
另外,由于model和view的所有交互都放到了presenter里面,所以model的使用也会变得更加高效。
MVVM
随着技术的不断发展,软件的UI层更加细节化、定制化。后来,微软架构师John Gossman在WPF的XAML模式推出的同时,提出了MVVM的概念。MVVM立足于原来的MVP和MVC,并且糅合了WPF的一些特性。MVVM最大的特点,就是数据绑定(来自WPF)。
MVVM和MVP模式很相近,除了需要为view量身定制一个model,这个model被称为ViewModel。ViewModel包含view中所有的接口和属性,并且使用ViewModel中的属性进行绑定。这样,view和ViewModel之间形成了双向数据绑定,这样的话,view中的变化可以直接在ViewModel中体现,而ViewModel的变化也可以直接在view中显示。
View一般很难测试,而现在的测试可以针对ViewModel来写。
另外,由于采用双向数据绑定,所以数据更新事件不需要用户再去手动写特殊用例,频繁数据更新的问题就可以得到优化。
iOS 中的MVC
苹果的官方文档上说自己采用的是MVC模式,如下图所示:
这样的模式,已经和我认识的MVP的模式一样了,因为纯粹的传统的MVC模式的确是无法满足现在的开发人员的需求,已经不符合现在的行情了。
但是,做过iOS开发的人应该都知道,实际上iOS采用的模式是下图这样的:
在cocoa里面,有UIViewController这个类,如果将它看成是Controller的话,那么在iOS的MVC模式里面,就会有以下问题:
- view和Controller的耦合性太高,很难进行分割。
- ViewController里面的内容和功能太多了,十分臃肿,会将这个模式变为Massive View Controller.
这时,为了给ViewController减轻负担,我们可以采用MVVM模式:将UIViewController当成是view,再新建一个ViewModel模块,将逻辑设定和运算等功能迁移到ViewModel中。
这样的好处是:可以成功减轻ViewController的负担,使得项目的理解、修改和维护都变得更加简单。
缺点就是:设计上更加复杂一些;MVVM模式使用的还不太广泛,同组开发人员如果有人不懂MVVM,那么合作上就会有点麻烦。