MVC、MVP、MVVM的成本角度结合业务,如何考虑选型?一文了解方方面面

大家都知道,使用架构的目的是使程序模块化,做到模块内部的高聚合和模块之间的低耦合,使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率。那么MVC、MVP、MVVM,该怎么选?在什么最省去开发时间和业务成本?

本篇来彻底理解MVC、MVP、MVVM这三个架构模式。首先我们来了解这三个架构模式原理简单解析

MVC、MVP、MVVM简单解析

MVC(Model-View-Controller)

Model:数据模型,用来存储数据 View:视图界面,用来展示UI界面和响应用户交互 Controller:控制器(大管家角色),监听模型数据的改变和控制视图行为、处理用户交互。

MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model(数据持久化)->View(将结果反馈给View)

三者关系

在MVC中,View是可以直接访问Model,那么View里会包含Model的信息,不可避免的也包含一些业务逻辑。在MVC模型里,更关注的Model改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但View是依赖于Model。而对Android来说,activity基本承担来view层和controller层两种角色,并且和model层耦合严重,在逻辑复杂的界面维护起来很麻烦。那么这时候MVP出来,切断View和Model之间的关系。

MVP(Model-View-Presenter)

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

Model:数据模型,用来存储数据 View:视图界面,用来展示UI界面和响应用户交互 Presenter:展示器,Presenter是从Model中获取数据并提供给View层,简单的就是当View需要去更新数据时,首先找Presenter,Presenter然后去向Model请求数据,从Model获取数据之后通知Presenter,Presenter再通知View去更新数据。简而言之:返回什么数据给View。

三者关系

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

MVVM(Model-View-ViewModel)

m:model 数据层 v:view 视图层 vm: 数据双向绑定

MVVM(Model-View-ViewModel)是一种软件架构设计模式,它是MVC的增强版,实质上和MVC没有本质区别,MVVM是以“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,而是通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图数据的变化会同时 修改数据源,而且数据源数据的变化也会立即反应到View上。 三者关系

这里是引用资料摘要:《Android核心开发手册》点击可查看详细进阶板块。

开发选型

开发成本:

  • MVC通常是最简单的,因为它没有明确的分层。但随着项目复杂度的增加,可能会导致代码耦合问题,增加维护成本。
  • MVP相对来说需要更多的代码,因为它需要为每个视图编写一个Presenter,但它有助于更好地分离关注点。
  • MVVM通常需要更多的初始工作,因为它们需要创建ViewModel或Intent,并且通常使用数据绑定库,这可能需要学习和实施额外的工具和框架。

测试成本:

  • MVC的测试通常较为困难,因为它的代码耦合度高。
  • MVP使单元测试更容易,因为逻辑分离得更清晰。
  • MVVM通常也易于测试,因为它们鼓励将业务逻辑与UI分开。

维护成本:

随着时间的推移,MVC可能会导致代码膨胀和维护困难,因为它的耦合度高。 MVP和MVVM提供了更好的可维护性,因为它们分离了关注点。

学习成本:

  • MVC相对容易学习,因为它没有太多的抽象概念。
  • MVP需要理解Presenter的角色,可能需要一些学习曲线。
  • MVVM需要理解ViewModel或Intent以及数据绑定的概念,可能需要更多的时间来学习和实践。

项目复杂度:

  • 对于小型项目,MVC可能足够,因为它更简单。
  • 对于中等到大型项目,MVP、MVVM可能更适合,因为它们有助于保持代码的可维护性和可扩展性。

总结

看到这里你心中想必肯定有答案了吧,选择架构模式应该是一个全面的决策,需要考虑成本、可维护性、测试性、团队技能以及特定业务需求。可能需要在项目的不同部分使用不同的架构模式,以便根据情况进行最佳优化。

架构和模式并不是说让你的代码量更少了,往往可能还会增大,但是它帮你在逻辑上更简单的了,很好的定义了单一原则,提供了更好的扩展性,方便定位问题以及后续需求变更时不至于满篇的去改一大堆东西。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞桨花滑骨骼点动作识别比赛记 2

基于 PaddleVideo 的花滑骨骼点动作识别 2s-AGCN配置文件节点流配置文件 2s-agcn_ntucs_joint_fsd.yamlMODEL 字段DATASET 字段PIPELINE 和 INFERENCE 字段OPTIMIZER 字段 agcn2s.pygraph输入通道数 骨骼流 Dataset 和 Pipeline配置文件DATASETPIPELINE 源码skeleton.pyskeleto…

【python爬虫】5.爬虫实操(歌词爬取)

文章目录 前言项目:寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHR?XHR怎么请求?json是什么?json数据如何解析?实操:完成代码实现 一个总结一个复习 前言 这关让我们一起来寻…

自动化的驱动力,工控机助您实现智能生产!

“智能工厂建设如火如荼,部分成果已经落地,在大规模资金投入的市场催化下,海尔、海信等制造企业通过智能工厂手段推进生产效率成倍增长的新闻层出不穷。在工业4.0时代,“中国制造2025”战略中,智能工厂构建都是其中不可…

python评分卡模型

信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级。人信用评级有一系列评级模型组成,常见是A卡(申请评分卡)、B卡(行为模型)、C卡(催收模型)和F卡(反…

Kubernetes(K8s 1.28.x)部署---超详细

目录 一、基础环境配置(所有主机均要配置) 1、配置IP地址和主机名、hosts解析 2、关闭防火墙、禁用SELinux 3、安装常用软件 4、配置时间同步 5、禁用Swap分区 6、修改linux的内核参数 7、配置ipvs功能 二、容器环境操作 1、定制软件源 2、安…

项目-IM

tim-server tim-server启动类实现CommandLineRunner接口,重写run()方法 run()方法开启一个线程,创建zk持久父节点,创建临时顺序子节点,将netty-server信息写入 1.1 用户登录 1.2 gateway向认证授权中心请求token 1.3 从zookee…

完整开发实现公众号主动消息推送,精彩内容即刻到达

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

Java小项目|拼图小游戏|黑马

项目技术需求 Java基础 基本if、forio流File集合JFrame【看得懂就行】 项目素材以及打包exe: 链接:https://pan.baidu.com/s/1rPazJezTwS9O6e8BoYNIYA?pwd6666 项目运行截图 项目来源 哔哩哔哩-黑马程序员上 哔哩哔哩-黑马程序员下 项目介绍&…

SQLPro Studio for Mac:强大的SQL开发和管理工具

SQLPro Studio for Mac是一款强大的Mac上使用的SQL开发和管理工具,它支持各种数据库,包括MySQL,PostgreSQL,SQLite等。使用 SQLPro Studio,您可以轻松地连接和管理您的数据库,执行SQL查询和脚本&#xff0c…

机器学习——KNN回归

1、前提知识: 回归:可以理解为拟合,就是根据训练数据的趋势,对输入数据进行预测。KNN回归:是一种有监督学习,因为需要提供目标数据(target) 2、案例: 用KNN回归拟合sin…

如何让ESP8266恢复出厂设置

1,安装python,2.7或者更高版本 2,运行:get-pip.py 3,运行:pip install esptool 4,运行的指令:esptool.exe --port COM3 erase_flash, 如果报错 就改成这样的命令试试&am…

【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

商城检索服务 1.检索页面的搭建 商品检索页面我们放在search服务中处理&#xff0c;首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 <!-- 添加Thymeleaf的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifa…

QSqlDatabase(2)实例,QTableView显示数据库表数据

目录 前言 1、实现的功能 2、具体的代码实现 前言 想了解QSqlDatabase基本知识的&#xff0c;以及增删改查的用法&#xff0c;可以浏览上一篇文章&#xff1a; QSqlDatabase&#xff08;1&#xff09;基本接口&#xff0c;以及(增删改除)的简单实例_Ivy_belief的博客-CSDN…

从钉钉到金蝶云星空通过接口配置打通数据

从钉钉到金蝶云星空通过接口配置打通数据 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能…

Java String类(1)

String类的重要性 我们之前在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据的方法分离开的方式不符合面向对象的思想&…

MySQL----索引

一、索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于c语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该…

06.DenseCap

目录 前言泛读摘要IntroductionRelated Work小结 精读模型模型构架全卷积定位层卷积锚点边界回归边界采样双线性插值 识别网络RNN 损失函数训练与优化 实验数据集&#xff0c;预处理DenseCap评价标准基线区域和图像级统计之间的差异RPN vs EdgeBoxesQualitative results 区域ca…

css-伪类:not实现列表最后一项没有样式

有了&#xff1a;not这个选择符&#xff0c;那么你将可以很好的处理类似这样的场景&#xff1a;假定有个列表&#xff0c;每个列表项都有一条底边线&#xff0c;但是最后一项不需要底边线。 示例&#xff1a; html: <ul><li>111111111111</li><li>21…

Linux 虚拟机同步时间crontab以及crond详解

目录 一 Linux 虚拟机同步时间设置 1. 检查是否安装cron服务&#xff08;即时间同步器&#xff09; 2. 下载时间同步器 3. 编辑crontab 内容 4. 同步更新电脑网络时间 5.设置 reload 6. 查看 crond 状态 二 crond 详解 1. 启动/关闭cron服务 2. crontab命令格式 3. …

Java设计模式:四、行为型模式-07:状态模式

文章目录 一、定义&#xff1a;状态模式二、模拟场景&#xff1a;状态模式2.1 状态模式2.2 引入依赖2.3 工程结构2.4 模拟审核状态流转2.4.1 活动状态枚举2.4.2 活动信息类2.4.3 活动服务接口2.4.4 返回结果类 三、违背方案&#xff1a;状态模式3.0 引入依赖3.1 工程结构3.2 活…