看了很多相关资料,越看越迷糊,感觉很多资料都没有说清楚,在此对自己理解的内容加以总结,并在最后附上本人认为解释得比较清楚的参考
##MVC
网上解释的版本太多,有说是单向流动,有的说M与V是完全分离的,有的说不是,图也有各种版本,其实都是MVC,只是衍生的各种变种
###传统MVC
MVC模式发展版本太多,很多资料上写的都有所不同,在此,先甩出传统MVC,传统MVC的图也有很多版本啊,但可以确定的是Model和View是有联系的,View会在Model上注册为监听者,当Model发生改变时会通知View进行更新,即观察者模式,在Cocoa官方文档中给出示意图如下(我认为比较清楚的):
- Model, 数据 + 业务逻辑
- View, 数据表现,即UI
- Controller, 负责用户输入,将用户命令转化成消息传递给Model或View
###现代MVC
现代MVC是在传统MVC进化的,很多人理解的MVC是Model和View没有联系,Model的改变不再通知View更新,而是通知Controller,让Controller去负责View的更新,即Model和View之间双向传递数据的中间协调者。
例如Cocoa版本的进化MVC,将Model层和View隔离开来,分别与Controller对接,Contoller充当两者的中间人,下图为官方示意图:
虽然说是Model与View隔离开来,但是在实际开发中,Model与View并非全无关系,很多情况下,View是知道Model的类型,通过向View抛出Model来更新View。
有一点很多资料没有提及到的是:MVC是由组合(Composite),策略(Strategy)和观察者(Observer)模式构成的一种复合模式(Compound Pattern),以下是苹果官方的解释,而Cocoa MVC则多了中介者(Mediator)和 命令(Command)模式
In the original (Smalltalk) conception, MVC is made up of the Composite, Strategy, and Observer patterns.
Composite—The view objects in an application are actually a composite of nested views that work together in a coordinated fashion (that is, the view hierarchy). These display components range from a window to compound views, such as a table view, to individual views, such as buttons. User input and display can take place at any level of the composite structure.
Strategy—A controller object implements the strategy for one or more view objects. The view object confines itself to maintaining its visual aspects, and it delegates to the controller all decisions about the application-specific meaning of the interface behavior.
Observer—A model object keeps interested objects in an application—usually view objects—advised of changes in its state.
##MVP
MVP模式有两种,分别是Passive View 和 Supervising Controller,网上大多数讨论的都是Passive View
Passive View(被动视图)MVP
对于Passive View的MVP,Model与View完全隔离,所有消息通过Presenter传递,View没有数据绑定,而是暴露出Presenter用来设置数据的setter属性,Presenter持有Model和View,View持有一个对应的Presenter,而Model则独立性最高,不持有View,也不持有Presenter。
- Model, 数据
- View, UI,逻辑几乎为0,将用户命令路由到Presenter
- Presenter, Model与View的中间人,包含业务逻辑
Supervising Controller(监视控制器)MVP
对于Supervising Controller的MVP,View和Model是可以直接绑定的,同时Presenter仍然控制对View上操作的响应,并能改变View,其实就是Presenter和View对逻辑代码分担的程度不同。
###MVC与MVP区别
Stackoverflow上的有个图我觉得挺形象的,Controller是大管家,Presenter是私人秘书
MVC
MVP
MVVM
与Passive View MVP相似,只是Presenter替换成ViewModel,最大的不同是View与ViewModel之间的双向数据绑定(Two-way data-binding)。下图来自Wiki百科。
- Model, 数据+业务逻辑
- View, UI
- ViewModel, Model与View的桥梁,负责界面逻辑与模型数据封装,包含数据绑定(data binding)
##总结
无论是MVC,MVP,还是MVVM,都是对模块的拆分及组合,C/P/VM都是M与V的粘合剂,区别在于如何处理Model与View的关系。
下表是三种模式的对比图(在此MVP指Passive View MVP)
MVC | MVP | MVVM | |
---|---|---|---|
特点 | 传统MVC,Model变化会通知View,现代MVC将两者隔离 | Model与View完全隔离,View逻辑几乎为0,基本所有业务逻辑放在Presenter | View与ViewModel的双向数据绑定 |
View&Model | Model对View不了解, ,大多数情况下View会持有Model | 完全隔离 | 完全隔离 |
View&C/P/VM | Controller持有一个或多个View,View不知道Controller | 通常一个Presenter映射一个View,View持有一个对应Presenter | 一个ViewModel可被一个或多个View持有,但ViewModel不知道View |
Model&C/P/VM | Controller持有Model,Model不知道Controller | Presenter持有Model,但Model不需要保存对Presenter的引用 | ViewModel持有Model,Model不知道Controller |
参考:
2.iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)
4.what-are-mvp-and-mvc-and-what-is-the-difference