MVC和MVVM

作者: 滚滚猫 | 来源:发表于2018-03-24 13:11 被阅读30次

    来聊一聊我理解中的MVC和MVVM

    MVC的定义:

    MVC(Model View Controller)是构建iOS App 的标准模式,是苹果推荐的一个用来组织代码的权威范式。苹果甚至这么说,在MVC下,所有的对象被归类为一个Model,一个View,和一个Controller。

    MVC各个部分负责的内容:

    Model:根据APP文档,model包括数据和操作数据的业务逻辑
    View:view通常是UIKit控或者UIKit控件的集合,不能直接引用model,并且视图本身没有任何业务逻辑
    Controller:controller协调model和view之间的所有交互

    MVC的工作流程及模型图:

    首先,view将用户交互通知给controller,然后controller通过更新model来反应状态的改变,model成功持有数据后通知controller来更新他们负责的view。工作流程图如下: MVC.png

    MVC的优缺点

    优点:
    1>各施其职,互不干涉:三个层各施其职,其中一层改变对其它层影响较小。
    2>有利于组件的重用:多个视图对应一个模型的能力等

    缺点:
    1>增加了系统结构和实现的复杂性:模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
    2>与控制器间的过于紧密的连接。
    3>较差的可测试性:MVC并不鼓励测试人员编写单元测试。因为view controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。
    4、厚重的ViewController:由于各种原因使ViewController过于臃肿庞大。

    MVVM的由来

    MVC在在实际的应用中,由于个人理解的不同,容易出现以下各种情况

    • model层其实非常单薄,model从厚重的业务模型变为数据模型,model层的业务逻辑如本地数据库操作,数据处理等被拖入了controller。
    • 网络逻辑一般也放在controller中(因为网络使用异步,这样如果一个网络比持有它的model生命周期更长,事情将变得复杂。显然也不该将网络代码放在view中)
    • 相应逻辑:对各种用户事件做出响应及各种代理方法一般也在viewController里处理。

    这就导致了controller变得厚重臃肿,让MVC变成了Massive View Controller,这时就出现了一种新的设计模式来替换MVC,就是MVVM

    MVVM的定义:

    MVVM(Model View ViewModel)衍生于MVC,它正式规范了视图和控制器紧耦合的性质,把 view和viewController正式联系在一起 ,我们把它们视为一个新的组件,并将controller中的业务处理逻辑,视图显示逻辑,网络逻辑,数据缓存逻辑等抽取出来,放入视图模型ViewModel中。

    MVVM各个部分负责的内容:

    Model:数据模型。ViewModel可以引用Model,反过来不行
    View|view controller :不能直接引用model,引用ViewModel
    viewModel:放置一些业务处理逻辑,视图显示逻辑,网络逻辑,数据缓存逻辑等(与其说是视图模型不如叫业务模型)

    MVVM的工作流程模型:

    首先,view|ViewController将用户交互通知给ViewModel,然后ViewModel通过更新model来反应状态的改变,model成功持有数据后通知ViewModel来更新他们负责的view。 MVVM.png

    MVVM的优缺点:

    优点:
    1>低耦合性:view可以独立于model进行变化和修改,一个viewModel可以绑定到不同的view上。
    2>可重用性:可以把一些视图逻辑放入viewModel中,让很多view重用这段视图逻辑
    3>独立开发:开发人员可以专注于业务逻辑和数据的开发viewModel,设计人员可以专注于页面设计
    4>可测试性:可以针对viewModel进行测试

    缺点:
    1>轻微的增加代码量,但总体上减少了代码的复杂度
    2>数据绑定使得bug很难被调试。例如:界面异常,可能是view的代码有bug,可能是model的代码有问题。
    3>对于大的项目,数据绑定和数据转化需要花费更所的内存

    参考文档
    http://www.cocoachina.com/ios/20170612/19500.html
    http://www.cnblogs.com/brycezhang/p/3840567.html
    http://www.mamicode.com/info-detail-989164.html

    end:小编是很认真的写文哦,如果小编的文对您有用,一定要点“喜欢”哦!如果有问题欢迎评论

    相关文章

      网友评论

        本文标题:MVC和MVVM

        本文链接:https://www.haomeiwen.com/subject/dbhqcftx.html