专栏首页李蔚蓬的专栏设计模式 | MVC、MVP、MVVM详析

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

MVC优缺点

  • 【缺点】MVC的耦合性还是相对较高, View可以直接访问Model,导致3者之间构成回路。 因此, MVP与MVC的主要区别】是, MVP中的View不能直接访问Model, 需要通过Presenter发出请求,View与Model不直接通信。 另外, 耦合性高的MVC,相对于MVP、MVVM, 可读性、健壮性、可拓展性都大打折扣,也不便于测试; 【MVC缺点的对立面,就是MVP、MVVM的优点】
  • 【优点】简单粗暴,适合简单项目

MVP优缺点

  • 【缺点】对于简单的应用来说 MVP 稍显麻烦, 各种各样的接口与概念,使得整个应用充斥着零散的接口!!!!! 【优点】但是对于比较复杂的应用来说,MVP 模式是一种良好的架构模式, 它能够非常好地组织应用结构,使得应用变得灵活,拥抱变化。
  • 【优点】MVP能够有效地降低View复杂性 避免业务逻辑被塞进View中, 使得View变成一个混乱的“大泥坑”。
  • 【优点】MVP模式会解除View与Model的耦合, 同时又带来了良好的可扩展性、可测试性 保证了系统的整洁性、灵活性

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三层相互耦合,耦合性很高;
  • 【CV,VM】 在Activity中, 可以向View发送指令,即调用UI逻辑方法【CV】, 再由View直接要求Model改变状态,即UI逻辑调度数据操作逻辑,或使得M层变化【VM】。
  • Controller直接调用UI逻辑处理UI(View)【CV】。
  • Controller直接调用数据操作逻辑,或使得M层变化【CM】。
  • Controller起到事件路由的作用, 同时业务逻辑都部署在Controller(Activity)中。

MVP实例分析

  • presenter——交互中间人 Presenter主要作为沟通View和Model的桥梁, 它从Model层检索数据后,返回给View层, 使得View和Model之间没有耦合, 也将业务逻辑从View角色上抽离出来。
  • View——用户界面 View通常是指Activity、Fragment或者某个View控件, 它含有一个Presenter成员变量。 通常View需要实现一个逻辑接口, 将View上的操作通过会转交给Presenter进行实现, 最后, Presenter调用View逻辑接口将结果返回给View元素。
  • Model——数据的存取 对于一个结构化的App来说, Model角色主要是提供数据的存取功能。 Presenter需要通过Model层存储、获取数据, Model就像一个数据仓库。 更直白地说, Model是封装了数据库DAO或者网络获取数据的角色, 或者两种数据获取方式的集合。

简单说,

  • 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层的实现,其他的,都是只是上层的调度,不实现;

参考文章:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发艺术笔记 | View的事件体系

    关于如何得到View的这四个参数, 在View的源码中它们对应于mLeft、mRight、mTop和mBottom这四个成员变量,获取方式:

    凌川江雪
  • 2.Android开发环境再普及以及ADB的使用技巧

    凌川江雪
  • 实战 | 详解MVC、MVP模式并分别实现登录界面案例

    本文参考技术资料做一个笔记,主要内容是总结MVC、MVP两个设计模式的思想,以及分别运用这两个模式的实现,实现两个project(MVCSmallTest还有M...

    凌川江雪
  • 来看三个问题

    是否允许在HTTP请求时,返回原始请求体数据字节,默认为false(GET or HEAD or 上传文件请求除外)。

    我的小碗汤
  • Spark系列(五)共享变量累加器

    累加器是共享变量的一种,它提供了信息聚合的一种方法,提供了将工作节点中的值聚合到驱动器程序中的简单语法,累加器常常被作为Rdd的map,filter操作的副产品...

    张凝可
  • Frontiers: 样本量决定了微生物数量

    Type: Perspective Published: 07August 2019

    生物信息知识分享
  • Flutter Widgets 之 Dialog 对话框

    当应用程序进行重要操作时经常需要用户进行2次确认,以避免用户的误操作,比如删除文件时,一般会弹出提示“是否要删除当前文件”,用户点击确认后才会进行删除操作,这时...

    老孟Flutter
  • Flutter Widgets 对话框-Dialog

    当应用程序进行重要操作时经常需要用户进行2次确认,以避免用户的误操作,比如删除文件时,一般会弹出提示“是否要删除当前文件”,用户点击确认后才会进行删除操作,这时...

    老孟Flutter
  • iOS Strong和Copy的区别

    结论:这种情况下,不管是用strong还是copy修饰的对象,其指向的地址都是originStr的地址。

    赵哥窟
  • Q2移动趋势报告解读:BAT掌权,Android为王

    今日百度2014年Q2移动趋势报告又如约而至。从2010年Q4开始,百度移动趋势报告已经连续发布14期,成为了能够反映中国移动互联网大趋势的为数不多的报告之一...

    罗超频道

扫码关注云+社区

领取腾讯云代金券