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

news2024/11/24 19:45:50

作者:抓不住老鼠的猫

三种架构模式

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

透过展会看思创·破茧突围稳中向好,开创激光智造新生态

日前,2023年第十七届慕尼黑光博会在上海国家会展中心成功举办。作为激光行业内快速崛起的“国家高新技术企业”,四川思创激光科技携最新的增材制造专用光纤激光器、高功率单模光纤激光器、手持激光焊设备等新一代产品,展示了在全新战略领域的创新成果。 本届展会思创激光科技以…

python flask 返回中文乱码

使用flask返回数据中带有中文的时候会显示成乱码(ascii), 中文报文: ABAP中的三大财务报表是:* **资产负债表** * **收入证明** * **现金流量表**这些报表全面概述了公司的财务状况和业绩。* **资产负债表**显示公司在特定时间点的资产、负…

招聘小程序制作:连接人才与企业

随着人才市场的竞争日益激烈,招聘小程序成为了企业寻找优秀人才和求职者找到理想工作的重要工具。通过招聘小程序,企业可以发布招聘信息、筛选简历,而求职者可以浏览职位、提交简历等。 招聘小程序的好处 精准匹配人才:招聘小程序…

【SpringBoot】从零开始封装自己的starter并且引入到其他项目中使用

从零开始封装自己的starter并且引入到其他项目中使用 简介 本文将介绍如何从零开始封装自己的starter并且引入到其他项目中使用 为什么要自己封装starter? 这样可以对spring以及其他第三方提供的starter做二次封装或者封装一些自己需要的内容提供给其他项目使用&…

实现大文件远程传输、备份和共享的小秘诀

随着公司规模的增长和业务量的提升,大文件远程传输、备份和共享已经成为了公司必须处理的重要问题。大文件传输和备份涉及到数据安全、数据传输速度、存储空间等多个方面,是一项复杂而又艰巨的任务。本文将从技术层面出发,介绍如何实现大文件…

C# OpenCvSharp+DlibDotNet 人脸替换 换脸

效果 Demo下载 项目 VS2022.net4.8OpenCvSharp4DlibDotNet 相关介绍参考 代码 using DlibDotNet; using OpenCvSharp.Extensions; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dra…

开发与测试的相杀相爱

无论开发或测试,都只是一份工作,要认真工作但不要私人感情。若是不下心产生了仇恨心理,请公私分明,在心里扎小人吧;若是产生了不可描述的感情,请低调点,毕竟IT工作已经很辛苦,不能再…

After Effects应该如何选择笔记本电脑?(专家指南)

与其他视觉效果软件相比,After Effects 对笔记本电脑显卡的依赖程度不如对 CPU 的依赖程度。单核性能对于 After Effects 来说非常重要。 然而,这并不意味着您的 GPU 不重要,由于强大的 GPU,某些效果的表现要好得多。简而言之&a…

Authing 入选长城战略咨询《2023 中国潜在独角兽企业》报告

2023 年 6 月 20 日,长城战略咨询(GEI)发布《2023 中国潜在独角兽企业研究》报告。Authing 作为国内首家身份云(IDaaS)厂商入选中国潜在独角兽企业榜单。独角兽企业指具有发展速度快、数量稀少、备受投资者青睐等属性的…

Baklib VS Helplook,企业帮助中心搭建软件对比

2023年,搭建帮助文档的方法与之前相比发生了质的变化,许多企业产品不再依托于传统的方式-本地文档、实体操作手册书,而是选择寻找工具搭建一个在线文档,直接搭建一个在线的帮助中心,用户直接可以访问查阅解决方案。Bak…

【C++初阶】list的模拟实现 附源码

一.list介绍 list底层是一个双向带头循环链表,这个我们以前用C语言模拟实现过,->双向带头循环链表 下面是list的文档介绍: list文档介绍 我们会根据 list 的文档来模拟实现 list 的增删查改及其它接口。 二.list模拟实现思路 既然是用C模拟…

Vue-Router相关理解4

两个新的生命周期钩子 activated和deactivated是路由组件所独有的两个钩子&#xff0c;用于捕获路由组件的激活状态具体使用 activated路由组件被激活时触发 deactivated路由组件失活时触发 src/pages/News.vue <template><ul><li :style"{opacity}&qu…

前端vue项目,加入pre-commit格式化工具prettier

husky工具 husky是一个工具&#xff0c;帮我们处理git hooks&#xff0c;在我们提交代码时候运行我们想要的脚本。工作原理是&#xff1a; 在package.json中加入对象&#xff0c;配置husky运行脚本。husky会决定在我们git的生命周期哪个阶段来运行。 安装husky: npm install …

聊聊用户故事的估算和拆解

这是鼎叔的第六十七篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 对于Scrum和用户故事实践的最大难点&#xff0c;我相信是如何估算用户故事的大…

数据可视化揭示人口趋势:从数字到图像的转变

人口是一个关乎我们生活的重要话题&#xff0c;而数据可视化技术为我们提供了一种全新的方式来理解和解读人口变化的趋势。通过将大量的人口数据转化为直观的图表和图像&#xff0c;数据可视化帮助我们更好地观察、分析和解释人类发展的重要特征。 数据可视化揭示人口趋势的第一…

Linux: USB Gadget 驱动简介

文章目录 1. 前言2. 背景3. USB Gadget 驱动3.1 什么是 USB Gadget 驱动&#xff1f;3.2 USB Gadget 驱动框架3.3 USB 设备控制器(UDC) 驱动3.3.1 USB 设备控制器(UDC) 驱动 概述3.3.2 USB 设备控制器(UDC) 驱动示例 3.4 USB Gadget Function 驱动3.5 USB Gadget 驱动3.5.1 USB…

针对文件内容匹配,过滤,排序

grep 过滤&#xff0c;针对文本内容进行过滤&#xff0c;也就是查找 grep -i 忽略大小写&#xff0c;默认的可以不加 grep -n 显示匹配行号 grep -c 只统计匹配的行数 grep -v ,取反&#xff0c;查找的内容不显示 grep的作用就是过滤文本内容&#xff0c;是针对行来进行处理…

navicate_windows_14

1.新建文本文档2.输入如下内容 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000"…

​python接口自动化(四十二)- 项目架构设计之大结局(超详解)​

简介 这一篇主要是将前边的所有知识做一个整合&#xff0c;把各种各样的砖块---模块&#xff08;post请求&#xff0c;get请求&#xff0c;logging&#xff0c;参数关联&#xff0c;接口封装等等&#xff09;垒起来&#xff0c;搭建一个房子。并且有很多小伙伴对于接口项目测试…

spring复习:(40)全注解的spring AOP

零、需要的依赖&#xff1a; <dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.9</version></dependency><dependency><groupId>org.aspectj</groupId><arti…