MVC、MVP、MVVM架构浅析

作者: Coder_老王 | 来源:发表于2019-02-26 11:29 被阅读56次

    MVC(Model-View-Controller)

    • 视图(View):用户界面。
    • 控制器(Controller):业务逻辑
    • 模型(Model):数据保存
    MVC.png

    工作原理

    1. View 传送指令到 Controller
    2. Controller 完成业务逻辑后,要求 Model 改变状态
    3. Model 将新的数据发送到 View,用户得到反馈

    MVC优缺点

    优点:
    把业务逻辑全部分离到Controller中,模块化程度高。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller换成另外一个Controller就行了。

    缺点:

    1. Controller测试困难。因为视图同步操作是由View自己执行,而View只能在有UI的环境下运行。在没有UI环境下对Controller进行单元测试的时候,Controller业务逻辑的正确性是无法验证的:Controller更新Model的时候,无法对View的更新操作进行断言。
    2. xml作为view层,控制能力实在太弱,Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能很多,导致代码量很大。如想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是Controller层又是View层。
    3. View层和Model层之间存在耦合。

    MVP

    • 视图(View):用户界面。
    • 控制器(Presenter):业务逻辑
    • 模型(Model):数据保存
    MVP.png

    工作原理

    1. View 传递请求给Presenter
    2. Presenter做逻辑处理,修改Model
    3. Model 通知Presenter数据变化
    4. Presenter 更新View
    1. 各部分之间的通信,都是双向的。
    2. View 与 Model 不发生联系,都通过 Presenter 传递。
    3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

    优缺点

    优点:

    1. 便于测试。Presenter对View是通过接口进行,在对Presenter进行不依赖UI环境的单元测试的时候。可以通过Mock一个View对象,这个对象只需要实现了View的接口即可。然后依赖注入到Presenter中,单元测试的时候就可以完整的测试Presenter业务逻辑的正确性。
    2. 避免了传统开发模式中View和Model耦合的情况,提高了代码可扩展性、组件复用能力、团队协作的效率。

    缺点:

    1. View(Activity)需要持有Presenter的引用,同时,Presenter也需要持有View(Activity)的引用,增加了控制的复杂度;
    2. MVC中Activity的代码很臃肿,转移到MVP的Presenter中,同样造成了Presenter在业务逻辑复杂时的代码臃肿

    MVVM

    • 视图(View):用户界面。
    • 视图-模型(ViewModel):View和Model之间的通信
    • 模型(Model):数据保存
    MVVM.png

    工作原理

    1. View 将请求转交给ViewModel
    2. ViewModel 操作Model数据更新
    3. Model 更新完数据,通知ViewModel数据发生变化
    4. ViewModel 更新View数据

    MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
    唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。

    优缺点

    优点:

    1. 低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
    2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
    3. ViewModel解决MVP中View(Activity)和Presenter相互持有对方应用的问题,界面由数据进行驱动,响应界面操作无需由View(Activity)传递,数据的变化也无需Presenter调用View(Activity)实现,使得数据传递的过程更加简洁,高效。

    缺点:

    1. ViewModel中存在对Model的依赖。
    2. 数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。
    3. IDE不够完善(修改ViewModel的名称对应的xml文件中不会自动修改等)。

    相关文章

      网友评论

        本文标题:MVC、MVP、MVVM架构浅析

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