浅谈下mvc和mvp、mvvm到mvvm+Jetpack

作者:抓不住老鼠的猫

三种架构模式

MVC

MVC全名为Model-View-Controller,图解如下

  • View:负责与用户交汇,显示界面。
  • Controller:负责接收来自view的请求,处理业务逻辑。
  • Model:负责数据逻辑,网络请求数据以及本地数据库操作数据等。

在MVC架构中,Controller是业务的主要承载者,几乎所有的业务逻辑都在Controller中进行编写。而View主要负责UI逻辑,而Model是数据逻辑,彼此分工。

MVC的本质就是按照UI、业务、数据不同的职责分三大模块,彼此分工。

但是一般的开发中

  • 几乎所有的业务逻辑代码都在controller中进行,会导致非常臃肿,降低项目的可测试性与可维护性。
  • view直接持有controller和model实例,不同职责的代码进行耦合,导致代码耦合性高,模块分工不清晰。

MVC好处:简单。他不需要写很多的代码来让代码解耦,这在在初创公司的小型项目非常有用。小型项目总体的代码量级小,可以提高开发效率

MVP

MVP全名是Model-View-Presenter。图解如下:

  • View:UI模块,负责界面显示和与用户交汇。
  • Presenter:负责业务逻辑,起着连接View和Model桥梁的作用。
  • Model:专注于数据逻辑。

MVP和MVC的区别很明显就在这个Presenter中。为了解决MVC中代码的耦合严重性,把业务逻辑都抽离到了Presenter中。这样View和Model完全被隔离,实现了单向依赖,大大减少了耦合度。view和prensenter之间通过接口来通信。

不同的view可以通过实现相同的接口来共享prensenter。presenter也可以通过实现接口来实现动态更换逻辑。Model是完全独立开发的,向外暴露的方法参数中含有callBack参数,可以直接调用callBack进行回调。

  • MVP通过模块职责分工,抽离业务逻辑,降低代码的耦合性
  • 实现模块间的单向依赖,代码思路清晰,提高可维护性
  • 模块间通过接口进行通信,降低了模块间的耦合度,可以实现不同模块独立开发或动态更换

MVP的最大特点就是接口通信,接口的作用是为了实现模块间的独立开发。presenter的作用就是接受view的请求,然后再model中获取数据后调用view的方法进行展示,因为每个界面都是不同的,这就导致了每个Activity/Fragment都必须写一个IView接口,然后还需要再写个IPresenter接口,从而产生了非常多的接口,需要编写大量的代码来进行解耦。 其次,prensenter并没有真正解耦,他还需要调用view的接口进行UI操作,解耦没有彻底。

因此,MVP缺点有:

  • 过度设计导致接口过多造成了接口地狱的问题,编写大量的代码来实现模块解耦,降低了开发效率
  • 并没有彻底进行解耦,prensenter需要同时处理UI逻辑和业务逻辑,presenter臃肿

MVVM
终于到了MVVM,可能很多人都感觉“卧槽这么牛逼的架构我肯定学不会”然后被劝退了继续使用MVC或者MVP。在我看来,MVVM和上面两种架构模式一样都是一种架构思想,只是谷歌推出了jetpack架构组件来让我们更好的使用这种架构模式。

MVVM,全名为Model-View-ViewModel。图解:

  • View:和前面的MVP、MVC中的View一样,负责UI界面的显示以及与用户的交汇。
  • Model:同样是负责网络数据获取或者本地数据库数据获取。
  • ViewModel:负责存储view的数据映像以及业务逻辑。

MVVM的view和model和前面的两种架构模式是差不多的,重点在ViewModel。viewModel通过将数据和view进行绑定,修改数据会直接反映到view上,通过数据驱动型思想,彻底把MVP中的Presenter的UI操作逻辑给去掉了。而viewModel是绑定于单独的view的,也就不需要进行编写接口了。但viewModel中依旧有很多的业务逻辑,但是因为把view和数据进行绑定,这样可以让view和业务彻底的解耦了。view可以专注于UI操作,而viewModel可以专注于业务操作。因而:

  • MVVM通过数据驱动型思想,彻底把业务和UI逻辑进行解耦,各模块分工职责明确。

View只需要关注Viewmodel的数据部分,而无需知道数据是怎么来的;而ViewModel只需要关注数据逻辑,而不需要知道UI是如何实现的。View可以随意更换UI实现,但ViewModel却完全不需要改变。

但依旧存在的问题是:viewModel会依旧很臃肿;上手也有一定的难度。

  • MVVM的viewModel依旧很臃肿。
  • MVVM需要学习数据绑定框架,具有一定的上手难度。

为了解决上面两个问题,google推出了上手难度相对较低的mvvm+Jetpack框架

做个简单的解析:

  • View对应的就是Activity和Fragment,在这里进行UI操作。
  • ViewModel中包含了LiveData,这是一种可观察数据类型框架。View通过向LIveData注册观察者,当LiveData发生改变时,就会直接调用观察者的逻辑把数据更新到view上。
  • ViewModel完全不需要关心UI操作,只需要专注于数据与业务操作。
  • Repository代表了Model层,Repository对ViewModel进行了减压,把业务操作般到了Repository中,避免了viewModel臃肿。
  • Repository对请求进行判断是要到本地数据库获取还是网络请求获取分别调用不同的模块。

jetpack的架构组件库是一整套完整的架构组件库,包括了:DataBinding,LiveData,ViewModel,Navigation,Lifecycle。下面我们简单了解一下每个组件的功能: 访问基于 activity 构建的可组合 API。

组件名功能点
DataBinding1.解基于数据驱动思想,决视图调用一致性问题,实现双向绑定2.避免编写样板式代码,提高效率
LiveData1.通过唯一可信源获取数据,正确分发数据2.与Lifecycle结合,拥有生命周期感知能力,配合viewModel实现作用域可控3.实现模块的单向依赖,抛弃接口回调
ViewModel1托管界面状态,解决状态管理问题2.实现跨页面数据分享,并为数据设置作用域,做到作用域可控3.实现单向依赖,避免内存泄露
Lifecycle1.以简便地方式解决生命周期管理的一致性问题 2.避免内存泄露的情况下让第三方组件随时获取生命周期状态,追踪事故所在的生命周期源,对错过时机的异步操作及时停止
Navigation1.通过遵循导航定则实现对Fragment的管理

我们只需要遵循他的开发规范,使用他的架构框架,就可以开发出非常健壮的项目。MVVM的本质是什么?

一种基于数据驱动型,将UI逻辑和业务逻辑彻底分离的架构模式。

区别

MVC是不同职责代码分离,MVP是在MVC的基础上通过接口通信降低模块间的耦合性,MVC,MVP都是广义上的架构模式,Android只是他们的一个应用场景。MVVM是专注于页面开发的架构模式,更加契合页面开发模式。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40985.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue学习笔记(一)

1.编辑器选择 是用vscode 和 webstrom 个人感觉 vscode的插件比较多,对vue3的支持比较好 webstorm的自动保存比较好 各有优劣吧 我学习的这个项目目前采用vscode 2.vue2 还是 vue3 框架学通了都是通用的,这个时间点来学肯定是学vue3 只是顾虑到团…

Java利用POI导入Excel数据(多个sheet、模板)

需求:根据excel模板导入数据 sheet1:1-6行为固定格式,且需要取值({xxx});7行开始为数据集合(list) sheet2:都为固定格式,取值地方:{xxx} 1、数据格式(两个Sheet&…

【redis】redis管道简述

redis管道可以一次性发送多条命令。 命令示例如下: [xxxlocalhost ~]$ echo -e "set k4 99\nincr k4\nget k4" | nc localhost 6379 \OK :100 $3 100下面先简述一下这条命令的组成,再简述一下管道的常用场景和注意事项。 首先,|是…

arping命令 ip地址冲突检测 根据ip查mac地址

arping命令介绍 arping 命令主要用来获取ip对应的mac地址,更新本地arp缓存表。平时主要用来探测ip地址是否冲突即同一个网络里,同一个ip不同mac地址的情况。ip地址冲突将导致网络故障。 arping常用命令参数 arping [参数] ip -U 强制更新邻近主机的a…

JVM系列(8)——对象的内存布局

1、对象的创建过程 加载-验证-准备-解析-初始化-申请内存-成员变量赋初始值-加载构造方法。 前半段是JVM系列(5)——类加载过程,申请内存可参考:JVM系列(3)——内存分配与回收策略。 2、对象在内存中的存…

81. 正则表达式

一、概述二、匹配单个字符三、匹配一组字符四、使用元字符五、重复匹配六、位置匹配七、使用子表达式八、回溯引用九、前后查找十、嵌入条件参考资料 一、概述 正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或…

高时空分辨率、高精度一体化预测技术的风、光、水自动化预测技术的应用

第一章 预测平台讲解及安装 一、高精度气象预测基础理论介绍 综合气象观测数值模拟模式; 全球预测模式、中尺度数值模式; 二、自动化预测平台介绍 Linux系统 Crontab定时任务执行机制 Bash脚本自动化编程 硬件需求简介 软件系统安装 …

ylb-接口2首页产品数据和接口3产品列表

总览: 1、service处理(分页查询) 在api模块下service包,创建一个产品接口ProductService:(目前方法为分页查询queryByTypeLimit(Integer pType,Integer pageNo,Integer pageSize)) package…

矩阵AB和BA的特征值相同

手写的,如下图: 即可证明,矩阵AB的特征值和BA的特征值相同。 关于矩阵转置和逆矩阵混合运算,有如下规律:

Elasticsearch 介绍及java集成

一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎,简称(ES), 成立于2012年,是一家来自荷兰的、开源的大数据搜索、分析服务提供商,为企业提供实时搜索、数据分析服务,…

(学习笔记-TCP连接断开)建立了连接,但是客户端或服务端出现问题,会怎么样?

客户端突然出现故障 客户端出现故障指的是客户端的主机发生了宕机或者断电的场景。发生这种情况的时候,如果服务端一直不会发送数据给客户端,那么服务端是永远无法感知到客户端宕机这件事的,也就是服务端的TCP连接将一直处于ESTABLISH 状态&…

【软考】系统架构设计风格分类的个人理解

个人适当学习了软考系统架构设计师中关于系统架构设计相关的内容,梳理了一下相关信息。 常见架构类型和常见分类 常见的软考中出现的系统架构列举如下: 分层架构管道-过滤器架构客户端-服务器架构模型-视图-控制器架构,即MVC架构事件驱动架…

AutoDL 训练stable-diffusion lora模型

1.创建镜像实例 2. 启动实例 3.启动服务 4.配置参数 4.1 基础模型选择 4.2 文件路径设置 5.点击打印训练信息 6.训练模型(点击Train model)

SpringBoot整合knife4j

knife4j 文档地址:https://doc.xiaominfo.com/ knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 Swagger介绍 前后端分离开发模式中,api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架,用于生成、描述、调用和…

华为发布大模型时代AI存储新品

7月14日,华为发布大模型时代AI存储新品,为基础模型训练、行业模型训练,细分场景模型训练推理提供存储最优解,释放AI新动能。 企业在开发及实施大模型应用过程中,面临四大挑战: 首先,数据准备时…

STM32学习笔记(十三)丨USART通用同步/异步收发器(串口外设的基本使用丨串口发送数据、串口发送+接收数据)

本篇文章包含的内容 一、STM32的USART外设1.1 STM32的USAER外设简介1.2 USART外设的结构和工作原理1.3 串口通信数据帧1.4 起始位侦测和USART的噪声判断机制1.5 波特率发生器 二、串口发送和接收数据包2.1 HEX数据包2.2 文本数据包2.3 固定包长HEX数据包接收2.4 可变包长文本数…

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码 1 题目 《节能与新能源汽车技术路线图 2.0》提出至 2035 年,新能源汽车市场占比超过 50%,燃料电池汽车保有量达到 100 万辆,节能汽车…

商品价格怎么监测

电商已经深入人们的生活,现在无论何种类型的产品,总能在电商平台找到相应的产品链接,品牌为了扩大销售,也会以电商平台作为重要的销售战场,所以电商平台的商品价格也是品牌重点关注的,电商平台的低价会引起…

kafka消息队列最常用的两种模式,以及应用场景

目录 一、发布-订阅模式 二、点对点模式 三、应用场景 一、发布-订阅模式 发布-订阅模式是最常见的消息传递模式,其中消息发布者将消息发送到一个或多个主题(Topic),而订阅者可以选择订阅一个或多个主题来接收消息。每个订阅者…

React(2)

题外话&#xff1a;vscode有个插件可以很方便的快速写代码 输入rcc回车 1.组件嵌套 import React, { Component } from reactclass Navbar extends Component{render(){return <div>Navbar</div>} }const Swiper()>{return <div>Swiper</div> }cons…