✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:
✨特色专栏: 知识分享
🥭本文内容: MVC、MVP、MVCC 和 MVI 架构的介绍及区别对比
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

​​1. MVC(Model-View-Controller)​​

​​核心思想​​

​​特点​​

​​问题​​

​​2. MVP(Model-View-Presenter)​​

​​核心思想​​

​​特点​​

​​变体​​

​​问题​​

​​3. MVCC(Model-View-Controller-Components)​​

​​核心思想​​

​​特点​​

​​与MVC区别​​

​​4. MVI(Model-View-Intent)​​

​​核心思想​​

​​特点​​

​​关键概念​​

二、​​架构对比表​​

​​三、如何选择​

​​四、趋势​​


一、背景

初入安卓开发,便遇到的以前做后端从未见过的设计模式。MVI?MVI是什么.....于是在网上扑腾资料,逐渐学习了多种架构模式。MVC、MVP、MVCC 和 MVI 是软件设计和架构中常见的模式或概念,各自适用于不同的场景。


​1. MVC(Model-View-Controller)​

​核心思想​
  • ​Model​​:数据逻辑和业务规则,独立于UI。

  • ​View​​:用户界面展示,被动反映Model状态。

  • ​Controller​​:接收用户输入,协调Model和View的更新。

​特点​
  • ​View直接依赖Model​​:Model变化时直接通知View(如观察者模式)。

  • ​Controller职责模糊​​:在复杂场景中可能成为“上帝类”。

  • ​典型应用​​:传统Web框架(如Spring MVC)、早期iOS开发。

​问题​
  • ​紧耦合​​:View和Model直接交互,难以测试。

  • ​Controller膨胀​​:业务逻辑易堆积在Controller中。


​2. MVP(Model-View-Presenter)​

​核心思想​
  • ​Model​​:与MVC相同,处理数据逻辑。

  • ​View​​:被动界面,通过接口与Presenter交互。

  • ​Presenter​​:取代Controller,作为中间人处理业务逻辑,解耦View和Model。

​特点​
  • ​View与Model完全隔离​​:所有交互通过Presenter。

  • ​测试友好​​:Presenter可脱离View进行单元测试。

  • ​典型应用​​:Android开发(如Google官方早期示例)、WinForms。

​变体​
  • ​Passive View​​:View极简,所有逻辑在Presenter。

  • ​Supervising Controller​​:View可处理简单逻辑。

​问题​
  • ​手动同步​​:需显式更新View,代码量可能增加。

  • ​Presenter可能过重​​:复杂场景下仍需拆分。


​3. MVCC(Model-View-Controller-Components)​

​核心思想​
  • ​扩展MVC​​:引入Components(可复用的UI组件),每个组件有自己的MVC三角。

  • ​分层协作​​:父Controller协调子Components。

​特点​
  • ​模块化​​:适合大型应用(如ERP系统)。

  • ​典型应用​​:后端复杂UI系统(如JavaServer Faces)。

​与MVC区别​
  • ​组件化​​:UI拆分为独立功能单元,降低耦合。

  • ​层级化​​:父子Controller/Component的协作关系。


​4. MVI(Model-View-Intent)​

​核心思想​
  • ​单向数据流​​:用户输入(Intent)→ Model更新 → View渲染。

  • ​不可变Model​​:状态不可变,每次更新生成新Model。

  • ​响应式编程​​:基于RxJava或Kotlin Flow实现数据流。

​特点​
  • ​状态集中管理​​:所有状态变化可预测、易调试。

  • ​适合复杂交互​​:如实时数据更新(股票应用、聊天软件)。

  • ​典型应用​​:现代Android开发(Jetpack Compose)、前端(React+Redux)。

​关键概念​
  • ​Intent​​:用户动作的抽象表示(如按钮点击→LoadDataIntent)。

  • ​状态机​​:View仅反映当前Model状态。


二、​​架构对比表​

特性

MVC

MVP

MVCC

MVI

​核心目标​

基础分离关注点

解耦View与Model

组件化复用

单向数据流+状态管理

​数据流向​

双向(View↔Model)

双向(通过Presenter)

层级化双向

严格单向(Intent→Model→View)

​测试难度​

较难(View耦合)

较易(Presenter可测)

中等(组件依赖)

易(状态可追踪)

​适用场景​

简单Web/iOS应用

传统Android应用

企业级后端UI

现代响应式应用

​典型框架​

Spring MVC, Django

Android Architecture

JSF, ASP.NET

Jetpack Compose, Redux


​三、如何选择

  • ​快速开发简单应用​​:MVC(如博客网站)。

  • ​需要高可测试性​​:MVP(遗留Android项目)。

  • ​企业级复杂UI​​:MVCC(后台管理系统)。

  • ​现代响应式UI​​:MVI(实时数据应用、移动端)。


​四、趋势​

  • ​移动端​​:MVP → MVVM(Data Binding) → MVI(Jetpack Compose)。

  • ​前端​​:MVC → Flux/Redux(类似MVI)。

  • ​后端​​:MVC → 分层架构(DDD+CQRS)。


 最后,

        希望文章对你有所帮助!

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

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

相关文章

【运维进阶】Ansible 角色管理

Ansible 角色管理 实验环境 [lthcontroller ~ 21:47:45]$ mkdir web && cd web[lthcontroller web 21:47:50]$ cat > ansible.cfg <<EOF [defaults] remote_user lth inventory ./inventory[privilege_escalation] become True become_user root become_m…

个人笔记SpringMVC

SpringMVC 1. 1.新建一个Maven-webapp项目 2.导入依赖pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.…

arcgis-提取范围中最大占比面积的信息或唯一值

此方法本来应用于计算图斑占最大面积的房屋质量等别/高程/坡度级别&#xff08;房屋质量等别/高程/耕地坡度计算在无特定条件下&#xff0c;遵循按面积占比最大值信息赋值&#xff09;。1、测试数据中&#xff0c;增加唯一值字段&#xff1a;WYZ&#xff0c;并刷上图斑唯一值信…

Webapi发布后IIS超时(.net8.0)

文章目录前言一、报错信息二、日志分析三、分析四、最终解决办法&#xff1a;前言 最近实现服务器数据导出&#xff1a; .net8.0的webapi 获取到post请求&#xff0c;查询数据后dbReader导出到workbook. 并保存Excel到远程的文件服务器。 问题&#xff1a;本地调试无问题&…

linux中的hostpath卷、nfs卷以及静态持久卷的区别

在 Linux 容器环境中&#xff0c;HostPath 卷、NFS 卷和静态持久卷&#xff08;Static PersistentVolume&#xff09;是数据持久化的重要方案。三者的核心差异体现在管理方式、适用场景、跨节点能力等方面。核心定义与工作原理1. HostPath 卷定义&#xff1a;直接将容器所在宿主…

Unity 中控开发 多路串口服务器(一)

一 Unity 中控开发 多路串口服务器 多路串口服务器基础型号配置被控投影设备LG-UART8 算法配置软件结果测试多路串口服务器 你好&#xff01; 这是关于一篇使用TCP调用多路串口服务器的系列文章。在后续文章中,会结合使用Unity做一个中控系统 基础 型号 ULEGS 多路串口服务…

服务器数据恢复—硬盘坏道离线导致raid崩溃的StorNext文件系统数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线&#xff0c;raid5磁盘阵列不可用。服务器存储数据恢复过程&#xff1a; 1、将故障服务器存储内的所有磁盘编号后取出&#xff0c;将所有没有离线的硬盘以只读方…

C++小游戏NO.1游戏机

#include<conio.h> #include<windows.h> #include<bits/stdc.h> #include<cstdlib> #include<ctime> #include<vector> #include<string> using namespace std; int Your6,Other6; string daojuname[]{"放大镜","sho…

OpenHarmony WebView引擎:从Chromium魔改到分布式渲染的终极解析

🏗️ 架构解析 arkweb是OpenHarmony webview组件的Native引擎,基于Chromium和CEF构建。 OpenHarmony WebView是基于Chromium CEF构建的高性能Web渲染引擎,为OpenHarmony系统提供完整的Web内容展示能力。该引擎采用分层架构设计,实现了与ArkUI的深度集成。 🏗️ 架构设…

Mybatis-3自己实现MyBatis底层机制

MyBatis整体架构分析一图胜千言1、Mybatis核心框架示意图2、对上图的解读1)mybatis的核配置文件mybatis-config.xml:进行全局配置&#xff0c;全局只能有一个这样的配置文件XxxMapper.xml配置多个SQL,可以有多个XxxMappe.xml配置文件 2)通过mybatis-config.xml配置文件得到SqlS…

Uniapp 之renderjs解决swiper+多个video卡顿问题

一、效果图二、示例代码 test.vue<template><view style"" :style"{height: windowHeightpx}"><swiper class"video-swiper" vertical change"swiperChange" :current"current" animationfinish"swiper…

设计模式之【快速通道模式】,享受VIP的待遇

文章目录一、快速通道模式简介1、简介2、适用场景二、示例1、JDK源码&#xff1a;ArrayList构造方法2、String.intern()方法3、缓存系统设计&#xff08;典型&#xff09;三、注意事项1、核心设计原则2、避坑指南参考资料一、快速通道模式简介 1、简介 快速通道模式是一种基于…

NineData云原生智能数据管理平台新功能发布|2025年7月版

本月发布 23 项更新&#xff0c;其中重点发布 8 项、功能优化 15 项。重点发布数据库 DevOps - 非表对象调试新增存储过程、函数、包的调试功能&#xff0c;支持对象编译、断点设置、执行控制&#xff08;continue/step into/step over&#xff09;、变量调试等全流程操作。数据…

APM32芯得 EP.29 | 基于APM32F103的USB键盘与虚拟串口复合设备配置详解

如遇开发技术问题&#xff0c;欢迎前往开发者社区&#xff0c;极海技术团队将在线为您解答~ 极海官方开发者社区​https://community.geehy.cn/ 《APM32芯得》系列内容为用户使用APM32系列产品的经验总结&#xff0c;均转载自21ic论坛极海半导体专区&#xff0c;全文未作任何修…

css过渡属性

前言 该属性用于元素各种 “改变” 后的过渡效果动画&#xff0c;包括但不限于颜色、宽高、缩放等。 如下图所示&#xff0c;使用过渡属性便可轻松完成。 示例代码 您可以直接复制运行&#xff0c;查看效果。 <div>demo</div>div {width:100px; height:100px;/* …

云计算核心技术之云存储技术

一、云存储技术1.1、云存储是什么从狭义上来说&#xff0c;云存储是指通过虚拟化、分布式技术、集群应用、网格技术、负载均衡等技术&#xff0c;将网络中大量的存储设备通过软件集合起来高效协同工作&#xff0c;共同对外提供低成本、高扩展性的数据存储服务。从广义上来讲&am…

在Ubuntu上安装并使用Vue2的基本教程

我也准备要尝试一些前端开发了&#xff01;发现网上有些教程写得挺好&#xff0c;但是还是有点老&#xff08;并且有点错误&#xff09;&#xff0c;所以这里更新一下&#xff1a; 主要参考了这篇教程&#xff1a;Vue2——1. 安装教程_vue2 cdn-CSDN博客 并且使用NPM方式进行…

任务十九 打包部署

一、本地打包部署 首先在自己的电脑上,下载一个nginx nginx: download 之后再vscode中,进行打包 输入命令 npm run build 打包过后,会在项目的根目录下,生成一个dist的文件夹

《飞算Java AI使用教程:从安装入门到实践项目》

前引&#xff1a;在当今人工智能技术飞速发展的时代&#xff0c;Java作为企业级开发的主流语言&#xff0c;正与AI技术深度融合。飞算Java AI是一款强大的工具集&#xff0c;旨在帮助开发者轻松构建和部署智能应用&#xff0c;涵盖机器学习、自然语言处理等核心功能。本教程将带…

NestJS 依赖注入方式全解

一、基础注入方式 1. 构造函数注入&#xff08;Constructor Injection&#xff09; 适用场景&#xff1a;模块间依赖传递&#xff0c;服务初始化时必须存在的依赖 实现方式&#xff1a;通过构造函数参数声明依赖&#xff0c;NestJS 自动解析并注入 Injectable() class UserServ…