最近细看了下Casa Taloyum写的View层架构设计,对其中提到的MVC、MVP、MVVM架构模式做了下总结,记录下自己的读书笔记。
MVC
谈到架构,就绕不开MVC架构,也可以说其他架构都是MVC架构的变形与优化,比如MVP、MVVM。MVC架构分为三部分:Model(数据管理)、View(视图管理)、Controller(控制器),三者之间的关系如下图:
从图中可以看出,Controller处在Model与View之间,负责协调Model与View的关系。那么MVC在移动端是怎么划分的呢?在服务器端View就是浏览器,显示视图给用户,但是在移动端没有浏览器,那么View放在哪里合适呢?iOS和Android都选择放在C里面了,iOS和Android都以View来充当View的容器(View Container),这也就解释了在iOS中命名Controller为UIViewController了,在Android中的C就是Activity。接下来看下三部分承担的职责如下:
M应该做的事:
- 给ViewController提供数据。
- 给ViewController存储数据提供接口。
- 提供经过抽象的业务基本组件,供Controller调度。
C应该做的事:
- 管理View Container的生命周期。
- 负责生成所有的View实例,并放入View Container。
- 监听来自View与业务有关的事件,通过与Model的合作,来完成对应事件的业务。
V应该做的事:
- 响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在View去做)等。
- 界面元素表达。
M的职责主要是取数据与存储数据,比如对网络数据进行存储。由于取数据与存数据的业务逻辑全部放在M中去处理,随着工程的庞大,M也会随之变大,也就是常说的胖Model。胖Model减轻了C要处理的事情,但是Model的复用率降低。有胖Model对应的就有瘦Model,瘦Model要达到的目的是,尽一切可能去编写细粒度Model,然后配套各种helper类或方法对弱业务做抽象,强业务依旧交给Controller。
在MVC架构中,随着软件规模的增大,C很容就变得很庞大很难测试很难维护,MVVM和MVP就是解为了解决这个问题。
MVVM
不管MVP、MVVM,它们的共识都是Controller会随着软件的成长,变得很大很难维护很难测试。MVVM是基于胖Model的架构思路建立的,然后在胖Model中拆出两部分:Model和ViewModel,从而使得Controller只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。
由于ViewModel本质上算是Model层,所以View并不适合直接持有ViewModel。另外一点是,ViewModel有可能并不是只服务于特定的一个View,使用更加松散的绑定关系能够降低ViewModel和View之间的耦合度。这也是大多数使用MVVM架构的都采用了ReactiveCocoa库的原因,因为ReactiveCocoa采用信号量机制使ViewModel和View之间松耦合。至此,大家可能有一个疑问,ViewModel和View之间已经能相互通信了,那Controller起到什么作用呢?如下所示:
View <-> Controller <-> ViewModel <-> Model
所以使用MVVM之后,就不需要Controller的说法是不正确的,严格来说MVVM其实是MVCVM。从图中可以得知,Controller夹在View和ViewModel之间做的其中一个主要事情就是将View和ViewModel进行绑定。在逻辑上,Controller知道应当展示哪个View,Controller也知道应该使用哪个ViewModel,然而View和ViewModel它们之间是互相不知道的,所以Controller就负责控制他们的绑定关系。Controller另一方面也负责常规的UI逻辑处理。
MVP
MVP跟MVVM差不多,分为Model、View、Present三部分,如下所示:
View <-> Controller <-> Present <-> Model
从上可以看出几乎和MVVM相似,但是两者还是有区别的,在MVVM中ViewModel与View之间通过ReactiveCocoa的信号量机制来进行交互的,而MVP中View与Present之间是通过依赖注入的方式来进行绑定的。在MVP中,通过抽出Present来处理部分的数据,从而达到了对Controller瘦身的目的。Android官方提供了MVP的demo供大家下载参考。
总结
所有的架构都源自于MVC,MVP、MVVM、MVCS等都是为了给Controller瘦身,把握住这一点,在理解其他架构模式方面就会游刃有余了。
参考文章
https://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-zhi-he-diao-yong-fang-an.html
http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis
国士梅花
欢迎大家关注国士梅花,技术路上与你陪伴。