【每日积累】浅谈mvc,mvvm,mvp

news/2025/10/21 8:32:15/文章来源:https://www.cnblogs.com/Dsir/p/19154065

复杂的软件必须有清晰合理的架构,否则无法开发和维护。

如果是一個人開發 App,不會有人管你怎麼寫、怎麼設計,反正自己開心就好。

但是如果是一群人同時在開發一個 App,這時候,層次分明、分工明確、模組化的設計架構就相當重要了,不但看起來賞心悅目,對於程式的維護性、修改性、擴充性、還有效能都能大幅提升,從好幾個人開發一個 App,變成一個團體為了一個共同的目標在合作。

MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。

1、MVC

说到设计架构,最一开始的就是MVC,MVC是Model-View-Controller的缩写,Model 处理数据,View 展示页面数据 Controller 则是两者之间的桥梁负责处理业务之间的逻辑来展示对应的数据.

View 直接与使用的用户互动,当View接受到使用者的回馈(比如要换页),则就需要Controller的参与,让Controller来操作Model拿取对应的数据返回给View,View再将数据呈现给用户查阅。

以上大致是MVC的流程,一般没有去特别设计什么架构的话大概都是MVC

在这里插入图片描述

优点:

  1. 非常直接,容易理解
  2. Controller 將 Model 和 View 分开来,具有一定程度的解耦合。

缺点

  1. 三者相互依賴,一但更新了其中一者,另外兩者也必須跟著修改
  2. 随着需求的增加,Controller的代码会越来越臃肿
  3. 难以进行单元测试。

所有通信都是单向的。

2、MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
和 MVC 不同的是,Model 拿到数据后,并不直接交给View进行渲染数据,而是交给 Presenter来处理,Presenter 再把数据回调交給 View,并更新界面。

在这里插入图片描述

  1. 各部分之间的通信,都是双向的。方便进行测试

  2. View 与 Model 不发生联系,都通过 Presenter 传递。

  3. View 非常薄,不部署任何业务逻辑,称为“被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

  4. 责任分工明确

3、MVVM

不管是 MVC还是MVP,都无法避免 Presenter(Controller) 的code会越来越臃肿的问题,如果能达到一样的效果(外部行为),
程式code当然是越好(内部行为),MVVM应运而生了。
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。就是将Presenter 改为 ViewModel
Model-View-ViewModel 通过观察者模式者将View 和 Model 巧妙的链接在一起,在我看来一切都是思维的精进
一旦 Model 的数据发生变化,观察者View感应到某部分的数据变动,并将数据呈现在对应的ui界面上,ViewModel 甚至不需要 View 的引用,更方便进行单元测试。

在这里插入图片描述

优点:

  1. 目前是非常迎合开发大众的需要
  2. 大幅的减少了操纵dom的代码,省去了 MVP 中Presenter的介入,Model 数据的改动也不需要callback 給 view,因为 View 会通过观察者 observe 感知数据的变化并更新页面的内容。
  3. 可以搭配 (DataBinding、LiveData)android等框架使用,能更方便地处理UI的更新,生命周期的处理。
  4. ViewModel 能够轻易的保存数据,且可以被多個 View 共享(MVC、MVP 也可以但不太适合场景的需要),View 与 View 之间传输数据也更方便(只有 MVVM 可以)。
  5. 编写测试时,MVP 需要 Mock 一個 View 对象才能进行对应的测试,由于 ViewModel 不需持有 View 的引用,更方便进行对应的测试。

缺点:

  1. 只针对android来说:入行門檻、學習成本高,且需要搭配 DataBinding、LiveData 等框架,才能發揮最大效益。
    唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。
    Vue,Angular,react 以及 Ember 都采用这种模式。

以下如有纰漏,请留言,一一查阅!

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

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

相关文章

时序攻击

细微差别背后,隐藏着惊人的安全漏洞两段看似相同的代码,为何一段安全另一段却致命?深入浅出时序攻击细微差别背后,隐藏着惊人的安全漏洞作为程序员,我们经常编写比较函数——比较字符串、密码、令牌等。但你是否想…

【React系列】一文让你了解React中Component和PureComponent差异之分

关于React中Component和PureComponent 你应该了解的 任何技术和产品产生的时候,都应该了解当时所处的场景,以及为什么会需要这个东西,他是来解决当下业务线那些弊端,又或者优化了什么,否则它的产生将毫无意义可言…

DIY ChatGPT 一周狂揽 27k Star「GitHub 热点速览」

上周,腾讯、阿里、蚂蚁到谷歌、Anthropic,各大厂都跟约好了一样,在 AI 各个领域疯狂“亮剑”。咱们吃瓜群众围观“神仙打架”的同时,开源社区也没闲着。抛开那些高大上的大模型不谈,GitHub 上的“野生”开源大神们…

Active Directory安全技巧:FSMO角色管理与PowerShell查询

本文详细介绍了Active Directory中FSMO角色的重要性,提供了使用PowerShell查询森林和域中FSMO角色持有者的具体代码,帮助系统管理员更好地管理域控制器备份和安全策略。Active Directory安全技巧第10篇:FSMO角色 获…

Random VIMs

Random VIMs 设置缩进 :set ts=4 sw=4 sts=4设置相对行号 :set relativenumber本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/19154054

【React系列】React.memo() vs useMemo()

React.memo()与useMemo()之间有什么主要区别? 性能优化是一只web开发中的一个重要讨论点。对于react团队同样如此,为了实现加速组件的渲染速度,采用“备忘录”的方式。 所以这个时候就React.memo()和 useMemo 钩子 …

【每日积累】javascript 一文弄懂eval

eval 动态化执行语句 概述 eval方法是javascript的全局方法,能够执行含有javascript代码的字符串,虽然eval方法带来强大的动态执行功能,但考虑其负面影响,建议少用,在特殊情况下可以使用eval方法动态改变代码的执…

腾讯云COS通过CDN加速配置指南 - 教程

腾讯云COS通过CDN加速配置指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

前端: 如何优化列表大批量的数据渲染

需求点:如何列表数据渲染进行优化? 最近业务上也碰到这个问题点。上网也查了查资料,貌似也经常问,特此写文章记录下来。关于如何处理以上上面的业务痛点: 就两点: 1 、虚拟列表是最主流的解决方案,不渲染所有的…

量子计算25年发展历程与技术挑战

本文回顾了量子信息处理会议25年发展历程,探讨了量子计算从理论到实验的突破,包括量子算法实现、量子复杂性理论对数学的影响,以及当前面临的可扩展性、错误率控制和实际应用等关键技术挑战。25年量子信息处理发展历…

tomcat启动一次问题的处理。

tomcat启动一次问题的处理。说明:2025.10.20,出现启动tomcat对任何请求都没有响应的情况。通过删除 $tomcat/work/Catalina 下的全部数据。并重启解决。但是重启需要的时间比较久。大约5分钟。

软件开发 --- trae如何和环境配合执行

软件开发 --- trae如何和环境配合执行trae会自动执行代码,但是执行前需要我们提前安装好所有的执行环境。 有的环境可能需要手动配合,比如trae在执行这个代码前手动触发环境执行。

marmot的一些特点

marmot的一些特点以前简单介绍过marmot ,以下说下一些特点 特点当前版本已经通过nats server 包内置到了服务中,不需要独立部署nats 了,但是推荐还是部署3个节点 默认内置的nats 没有开启认证,注意使用,同时nats …

应用安全 --- 如何反编译一个超大的函数

应用安全 --- 如何反编译一个超大的函数先用ida反编译一下 再用claude max 完善代码并配合完整的提示词 再次执行上述过程直到没有任何遗漏的代码

藏宝阁

书籍轻松主义★★★★☆反脆弱★★★★★娱乐至死★★★★☆动物庄园★★★★★谈谈方法★★★★☆小说雪中悍刀行★★★★★剑来★★★★★斗破苍穹★★★★★完美世界★★★★★武动乾坤★★★☆☆我在精神病院学斩神…

【模块化解读】commonjs vs commonjs2 exports vs module.exports

背景 最近在用typescript写工具库的时候,无意中在 webpack中看到了两个关键字,commonjs 和 commonjs2. 瞬间产生了好奇。后面看了issues才得知它们与模块化 导出有着密切关系。 CommonJs spec defines only exports.…

【GitHub每日速递 251021】一键将全新Arch安装变身超美现代Web开发系统!Omarchy太神了

原文: https://mp.weixin.qq.com/s/aE_bPqSXRQxxH7zq_4HYIQ 一键将全新Arch安装变身超美现代Web开发系统!Omarchy太神了 omarchy 是一个基于 Arch Linux 和 Hyprland 桌面环境的自动化配置工具。简单讲,它是一套预设…

[Mongodb]mongodb的安装以及增删改查

mongodb的安装 mongo主页 下载完成之后将目录放置下方 /usr/local/安装之后就配置环境变量: vim ~/.bash_profile下方是我自己的环境变量配置 # JDK_HOMEJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.j…