到今天为止进入美人信息大概有 7 个月时间,在项目结构原来一直采用 MVC
的架构来进行搭建。但是随着目前在一起的项目功能模块越来越多,MVC
越来越难以瞒着当前实现灵活拓展功能。所以公司就打算采用 MVVM
架构来对项目进行重构,下面小编就以 MVC
和 MVVM
来进行讲解和对比两者之间的优劣。
MVC
和 MVVM
简述
MVC
介绍
记得大概在一年前的时候曾经写过 MVC
的使用和相关一些介绍,这里方便做对比再次对 MVC
进行详解。参考资料 iOS MVC
设计模式
在 GUI
编程领域,MVC
已经拥有差不多 50 年的历史了。早在几十年前,Smalltalk-76
就对 MVC
架构模式进行了实现,在随后的几十年历史中,MVC
产生了很多的变种,例如:HMVC
、MVA
、MVP
、MVVM
和其它将 MVC
运用于其它不同领域的模式。
传统的 MVC
【图片来源于网络】
传统的 MVC
的实现结构图可以看出:Controller
可以直接与 View
和 Model
两者之间进行数据传递,View
可直接从 Model
读取数据进行更新。而且在 Controller
更新 View
模型时是采用直接替换方式,而不是跟新的方式。着移动端这是对界面的没有丝毫的复用,很明显在移动端使我们目前不会采取的。
Apple
的 MVC
【图片来源于网络】
Apple
的 MVC
是采用 Controler
、View
和 Model
三者完全解耦进行理想下数据操作模式。Controler
与 View
、Model
直接更新显示视图界面以及对数据模型初始化和更新,然后通过得到数据更新来传递给界面进行显示。View
通过相关的点击或者手势来对控制器进行交互,传递数据或者是相关事件的传递。Model
更新数据或者是更新数据模型通过通知的方式传递给 Controller
控制器。
但是上面在 apple 官方建议中使用
xib
或者是storyboard
来实现View
和Controller
两者的完全分离。
开发见到的 MVC
【图片来源于网络】
在实际开发过程中小编所在项目组很多情况是使用代码来初始化 View
模块。这样实际还是上 Controller
和 View
具体关系如上,两者之间有一定的交接和联系。而且Controller
还控制着 View
模块的生命周期,同样也对 Model
是所属关系。而非在传统或者是 Aplle
建议的那样是平行关系。
在前面的文章中有讲述
MVC
中Controler
、View
和Model
三者里面具体实现和相关管理内容,详情参考:iOSMVC
设计模式
MVP介绍
MVP
是从经典的模式 MVC
演变而来,它们的基本思想有相通的地方:Controller/Presenter
负责逻辑的处理,Model
提供数据,View
负责显示。
MVP
与 MVC
有着一个重大的区别:
在
MVP
中View
并不直接使用Model
,它们之间的通信是通过Presenter
(MVC
中的Controller
)来进行的,所有的交互都发生在Presenter
内部,而在MVC
中View
会直接从Model
中读取数据而不是通过Controller
。
【图片来源于网络】
在上面的
MVP
流程结构可以看出:在MVP
实现中Presenter
代替Controller
代替实现View
heModel
之间的沟通桥梁。只是MVP
中View
并不直接使用Model
。
MVVM介绍
MVVM
架构模式是微软在 2005 年诞生的,从 Model-View-ViewModel
这个名字来看,它由三个部分组成,也就是 Model
、View
和 ViewModel
。
在 MVC
的使用过程中小编给大家讲述过 Model
和 View
里面所有的形式,相应的功能。
ViewModel
视图模型对象
代替原来 MVC
中的 Controller
视图控制器来和 Model
进行相关的数据交互,在这里把原本在 Controller
里面进行相关计算或者是操作的处理统一放在此类中进行完成。
【图片来源于网络】
在程序实现 MVVM
工程图中可以看出:UIView
和 UIViewController
被看做是一个整体来进行视图展示和生命周期的控制,原来我们需要对数据模型理数据在 Controler
做出相关梳理操作放在 ViewModel
里面进行相关操作。ViewModel
取代 Controler
来实现 View
和 Model
两者之间数据更新或者是数据模型更新工作。
MVC
和 MVVM
代码实现
MVC
代码实现
(1) Person
模型对象
1 |
|
(2) Controller
控制器对象
1 |
|
MVVM
代码实现
(1) PersonModel
视图模型对象
把上面在 MVC
中 Controller
处理数据放在 PersonModel
进行处理。实现代码如下:
1 | @class Person; |
(2) Controller
控制模型
1 |
|
上面可以看出在使用
MVVM
过程中我们可以减少在Controller
里面对数据过多处理的造成Controller
臃肿的问题。编码过程中由于数据处理从
Controller
转换到ViewModel
中实现,可以Controller
数目更加方便我们对Controller
管理。让开发更加方便。