Android开发Android开发经验谈Android技术知识

设计模式 | MVC、MVP、MVVM详析

2020-04-12  本文已影响0人  凌川江雪

可结合这篇博客的项目代码,阅读本博客,会容易理解很多;

MVC优缺点

MVP优缺点

MVVM优缺点

MVVM与MVP非常相似,
它们间的区别:
View和Model进行双向绑定(data-binding),
两者之间有一方发生变化则会反应到另一方上;

MVP中的View更新需要通过Presenter,
而MVVM则不而需要,
因为View与Model进行了双向绑定,
数据的修改会直接反应到View角色上,
而View的修改也会导致数据的变更。

ViewModel角色需要做的只是业务逻辑的处理,
以及修改View或者Model的状态。

【MVVM模式有点像ListView与Adapter、数据集的关系】
这个Adapter就是ViewModel角色,
它与View进行了绑定,又与数据集进行了绑定,
数据集合发生变化时,
调用AdapternotifyDataSetChanged之后View直接更新
它们之间没有直接的耦合,使得ListView变得更为灵活

  • 【优点】
    1 .【解耦VM层】;
    2 .【对控制器瘦身】
    MVVM可以看成是MVC的进化版,
    它可以把Activity中的大量VC逻辑【UI、控制调度、业务逻辑】封装到ViewModel层中,
    使得Activity代码架构性能提升不少;
    3 .【数据双向绑定】
    当Model变化时,View-Model会自动更新,View也会自动变化。
    很好做到数据的一致性,MV联动比MVP快捷、灵活;

  • 【缺点】
    1 .【ViewModel长期持有数据源时,需注意内存泄漏】
    一个大的模块中,ViewModel也会很大,
    虽然使用方便了也很容易保证了数据的一致性,
    但是当长期持有数据源,不释放内存,就造成了花费更多的内存,
    静态变量长期维持到大数据对象的引用,阻止垃圾回收,容易产生内存泄漏。
    2 .【ViewModel的灵活性、可拓展性等问题】
    业务逻辑大部分只能让ViewModel承担,
    项目一大,可读性、可测试性等就会降低;
    3 .【测试时部分问题难度增加】
    数据绑定使得部分bug调试难度增加。
    当界面异常时,
    bug可能出在View代码中,也可能出在 Model 的代码。

MVC实例分析

  • M可以由数据Bean类(结合数据文件)实现;
    C控制/调度逻辑业务逻辑【业务功能实现】,由Activity实现;
    Vxml布局文件UI逻辑【UI逻辑由Activity实现】;



  • V与C的逻辑同在Activity,会相互耦合。【VC,CV】;

    Activity可以直接访问M层(数据类、数据操作),
    而CV两层都在Activity中,
    即CV又分别会跟M耦合【CM,VM】

    所以MVC三层相互耦合,耦合性很高;

MVP实例分析

简单说,

  • M可以由数据Bean类(结合数据文件)等实现;
    Vxml布局文件UI逻辑
    【UI逻辑分UI逻辑接口UI具体逻辑
    UI逻辑接口是定义接口实现,
    UI具体逻辑Activity(Fragment)实现UI逻辑接口具体实现】;
    P控制/调度逻辑业务逻辑【业务功能实现】,
    业务逻辑接口业务逻辑接口实现类实现;

    元素小结:
    数据封装类,
    【一套业务中,下面四个元素是必须的,
    UI逻辑实现类 use 业务逻辑实现类
    业务逻辑实现类 依赖 UI逻辑接口实例
    类文件名、文件中逻辑,相互对应,形成一套业务!】
    UI逻辑接口,UI逻辑实现类(Activity/Fragment),
    业务逻辑实现接口,业务逻辑实现类

MVP成分解析

  • 【V】UI逻辑接口抽象UI实现的逻辑;

  • 【V】UI逻辑实现类(Activity/Fragment)
    实现UI逻辑接口方法,具体实现UI逻辑【更新UI、启动UI动画等】;

    【VP】
    准备一个业务对应的Presenter成员变量
    用于在对应时机调度Presenter业务方法
    也调度对应的Presenter的绑定方法,
    Presenter与自身绑定;

  • 【P】业务逻辑实现接口抽象业务逻辑方法,

  • 【P】业务逻辑实现类实现业务逻辑实现接口的逻辑方法;

    【PV】
    准备一个UI逻辑接口成员变量 还有 一个绑定方法,
    用于 绑定 UI逻辑接口实例,
    UI逻辑接口实例 可以 用来调用 UI逻辑实现类中的 具体实现的 UI方法
    调用的时候可以把数据操作获得的数据也传过去View层

    【PV、PM】
    业务逻辑实现类中 实现的一系列 业务方法
    每一个 业务方法其实就是对某种场景要实现的业务逻辑的封装,
    也就是业务方法中,封装了一系列逻辑,
    也封装了一系列数据操作的方法, 和UI逻辑方法;【PV、PM】

注意!!

一个UI逻辑实现类(Activity/Fragment)可以实现多个 UI逻辑接口
绑定多个业务逻辑实现类
以便调用多种业务逻辑
实现多套业务;
另外,
多个UI逻辑接口之间,
多个业务逻辑接口之间,
重复的部分可以进一步进行抽象;(可参考文首博客)

MVP规范亮点细品

  • 【基于每秒的回调机制】
    UI逻辑UI逻辑实现类(Activity/Fragment)中具体实现,
    业务逻辑实现类中被调用;
    业务逻辑方法业务逻辑实现类中具体实现,
    UI逻辑实现类(Activity/Fragment)中被调用;


  • 【MV解耦!!】
    按照MVP套路规范,
    View层,也就是UI逻辑实现类(Activity/Fragment)要访问数据的时候,
    一般都不是直接在自己类中具体实现数据操作逻辑的,
    而是通过调用业务逻辑实现类【P】的业务方法
    间接调用到业务方法中的数据操作逻辑;

    即,MV解耦,
    V层制作V层的实现,其他的,都是只是上层的调度,不实现;






参考文章:

上一篇下一篇

猜你喜欢

热点阅读