架构设计系列(三):架构模式
一、概述
关于移动应用开发中常见的架构模式,这些模式是为了克服早期模式的局限性而引入。常见的 架构模式有:
MVC, MVP, MVVM, MVVM-C, and VIPER

二、MVC, MVP, MVVM, MVVM-C, and VIPER架构模式
MVC、MVP、MVVM、MVVM-C 和 VIPER 是移动应用开发中常见的架构模式。它们的目标是将代码分离为不同的职责模块,以提高可维护性、可测试性和可扩展性。
-
MVC(Model-View-Controller)
mvc 由 model层、view层和controller层组成。model层负责数据逻辑和业务逻辑,view层负责 UI 展示,controller 层负责处理用户输入,更新 Model 并刷新 View。
其优点是简单易用,分离了数据、UI和逻辑,适合小型应用,用于一些快速需要快速开发场景中。
但随着业务的及代码量的增长,Controller层容易变得臃肿,view和model之间耦合较高,会出现“万能类”,难以测试及维护 -
MVP(Model-View-Presenter)
MVP由model层、view层和presenter层组成
presenter层负责处理用户输入,更新 Model 并更新 View,model层负责数据逻辑和业务逻辑,view层负责 UI 展示,并通过接口与 Presenter 交互。
其优点是view与model完全解耦,方便测试,Presenter 作为中间层,减少了 Controller 的臃肿问题
但随着业务的增长Presenter 仍然可能变得复杂,同时需要手动管理 View 和 Presenter 的生命周期。 -
MVVM(Model-View-ViewModel)
MVVM由model层、view层和ViewModel层组成。Model负责数据逻辑和业务逻辑,View负责 UI 展示,并通过数据绑定与 ViewModel 交互,ViewModel负责将 Model 的数据转换为 View 可以使用的形式,并处理用户输入。
数据绑定减少了手动更新 UI 的代码。View 和 ViewModel 解耦,便于测试和维护。
数据绑定可能增加调试难度。对于简单应用可能显得过于复杂。 -
MVVM-C(Model-View-ViewModel-Coordinator)
MVVM-C由model层、view层和ViewModel层及Coordinator层组。 Model负责数据逻辑和业务逻辑,View负责 UI 展示,并通过数据绑定与 ViewModel 交互,ViewModel负责将 Model 的数据转换为 View 可以使用的形式,并处理用户输入。引入 Coordinator负责导航和模块之间的交互。
其优点是引入 Coordinator 进一步解耦导航逻辑,适合复杂的导航场景。 -
VIPER(View-Interactor-Presenter-Entity-Router)
VIPER由View,Interactor、Presenter、Entity及Router组成。View负责 UI 展示,并将用户输入传递给 Presenter,Interactor负责业务逻辑和数据操作,Presenter负责从 Interactor 获取数据并更新 View,
Entity负责数据模型,Router负责导航和模块之间的交互。
其优点是高度模块化,职责分离明确,适合大型团队和复杂应用。
与此同时也增加了代码量和复杂性,对于开发团队的学习成本较高。
三、总结
以下是这些架构模式的主要区别:
| 模式 | 核心特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| MVC | 分离 Model、View 和 Controller | 简单易用 | Controller 臃肿,耦合高 | 小型应用 |
| MVP | 引入 Presenter 解耦 View 和 Model | 便于测试 | Presenter 可能复杂 | 中型应用 |
| MVVM | 引入 ViewModel 和数据绑定 | 高度解耦,便于测试 | 数据绑定调试复杂 | 大型应用 |
| MVVM-C | 引入 Coordinator 解耦导航逻辑 | 适合复杂导航场景 | 增加了复杂性 | 大型应用,复杂导航 |
| VIPER | 高度模块化,职责分离明确 | 适合大型团队 | 代码量大,学习曲线高 | 超大型应用 |
选择哪种架构模式取决于应用的规模、团队的规模以及具体的需求。小型应用可以选择 MVC 或 MVP,而大型应用则更适合 MVVM、MVVM-C 或 VIPER。
相关文章:
架构设计系列(三):架构模式
一、概述 关于移动应用开发中常见的架构模式,这些模式是为了克服早期模式的局限性而引入。常见的 架构模式有: MVC, MVP, MVVM, MVVM-C, and VIPER 二、MVC, MVP, MVVM, MVVM-C, and VIPER架构模式 MVC、MVP、MVVM、MVVM-C 和 VIPER 是移动应用开发中…...
[C++语法基础与基本概念] std::function与可调用对象
std::function与可调用对象 函数指针lambda表达式std::function与std::bind仿函数总结std::thread与可调用对象std::async与可调用对象回调函数 可调用对象是指那些像函数一样可以直接被调用的对象,他们广泛用于C的算法,回调,事件处理等机制。…...
强化学习-NPG
NPG来源于PG算法,是TRPO算法的前身。 随机梯度策略算法的输入输出问题(不得不考虑的): PG算法用函数表示策略,该表示方法不直接输出动作(有别于“确定性梯度策略”),那么就有两种可以…...
JVM学习与理解
目录 JVM介绍: 解释: 特点: 整体构成: 执行过程: 运行时数据区: Java堆剖析: 堆内存区域划分 为什么要分代呢? 内存分配: 新生区与老年区配置比例:…...
ArrayList、LinkedList、Vector
ArrayList 和 LinkedList 的区别是什么? 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实 现。 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 Linked…...
数据守护者:备份文件的重要性及自动化备份实践
在信息化社会,数据已成为企业运营和个人生活的重要组成部分。无论是企业的核心业务数据,还是个人的珍贵照片、重要文档,数据的丢失或损坏都可能带来无法估量的损失。因此,备份文件的重要性愈发凸显,它不仅是数据安全的…...
【LLM强化学习】Deep使用的强化学习方法 GRPO 理论理解与实践
一、写在前面 预训练 赋予了 LLMs 广阔的知识和强大的语言能力,但模型本身并不知道 什么是好的,什么是坏的,什么是符合人类偏好的。我们需要 引导 LLMs 学习人类的价值观,理解指令背后的意图,并生成更安全、更可靠、更符合人类期望的文本。强化学习(Reinforcement Learn…...
初阶c语言(练习题,猜随机数,关机程序)
目录 第一题,使用函数编写一个随机数,然后自己猜,猜随机数 第二道题(关机程序) 实现代码(关机程序) 实现代码(猜数字) 前言: 学习c语言,学习…...
TypeScript 与后端开发Node.js
文章目录 一、搭建 TypeScript Node.js 项目 (一)初始化项目并安装相关依赖 1、创建项目目录并初始化2、安装必要的依赖包 (二)配置 TypeScript 编译选项(如模块解析方式适合后端) 二、编写服务器代码 &a…...
基于SSM+uniapp的鲜花销售小程序+LW示例参考
1.项目介绍 系统角色:管理员、商户功能模块:用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试环境&#x…...
数据开放共享和平台整合优化取得实质性突破的智慧物流开源了
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
2025互联网医院系统源码解析:AI陪诊问诊APP的未来发展
2025年,AI陪诊问诊APP将如何在技术上创新,如何推动互联网医院的进一步发展,成为了我们今天探讨的核心内容。在本文中,我们将通过源码解析,深入分析这一前沿技术的未来发展趋势,帮助广大从业者更好地理解这一…...
【NLP 22、语言模型 language model】
有时候我也想听听,我在你心里,是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的,也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲,语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…...
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录 前言与导论 碎碎念 所以,我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问,他非常好奇…...
Eclipse:关闭多余的工具条
Eclipse默认的工具条非常多,可以通过如下方法选择关闭一些不常用的: 1.选择菜单Window -> Perspective -> Customize Perspective 2.根据需要勾选Toolbar Visbility下面的工具条项...
Git标签管理:从基础到高阶自动化实践
引言 在软件发布过程中,88%的生产事故与版本标记错误相关。Git标签(Tag)作为版本控制的关键锚点,不仅是发布流程的里程碑,更是代码审计和问题追溯的重要依据。本文将深入Git标签的底层机制,揭示企业级标签…...
【第3章:卷积神经网络(CNN)——3.6 CNN的高级特性与优化策略】
在2012年ImageNet竞赛的颁奖现场,当AlexNet以超出第二名10%的惊人准确率夺冠时,整个计算机视觉界都意识到:这个叫CNN的架构正在重写游戏规则。十年后的今天,当我们站在YOLOv8、Vision Transformer等新架构的肩膀上回望,会发现经典CNN的进化史就是一部浓缩的深度学习发展史…...
【R语言】非参数检验
一、Mann-Whitney检验 在R语言中,Mann-Whitney U检验(也称为Wilcoxon秩和检验)用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验,适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...
250214-java类集框架
单列集合是list和set,list的实现类有ArrayList和LinkedList,前者是数组实现,后者是链表实现。list和set,前者有序、可重复,后者无序不可重复。 1.单列集合 1.1. list java.util.List接口继承自Collection接口&#…...
集成测试总结文档
1. 集成测试的定义 集成测试(Integration Testing)是在单元测试之后,将多个独立的软件模块或组件组合在一起进行测试的过程,目的是验证这些模块之间的接口、数据传递、协作逻辑是否符合设计要求,并发现因集成引发的缺…...
POI 的 Excel 读写操作教程
POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改&am…...
ROS2 话题通信
1. 基本概念 发布-订阅模型:节点间通过话题(Topic)异步通信,发布者(Publisher)发送消息,订阅者(Subscriber)接收消息。 话题(Topic):…...
【学习资源】时间序列数据分析方法(1)
时间序列数据分析是一个有趣的话题,让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法:信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...
Hadoop集群安装与配置指南(CentOS 7)
Hadoop集群安装与配置指南(CentOS 7) 一、虚拟机准备 安装虚拟机软件 下载VMware或VirtualBox,完成安装并激活。 注意:选择NAT模式,配置子网IP(如192.168.10.0)。 CentOS 7安装 下载CentOS 7…...
Streamlit与Qlib:量化投资策略可视化实战
Streamlit与Qlib:量化投资策略可视化实战 1. 项目背景 在量化投资领域,数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。 2. 环境准备 2.1 安装依赖 # 安装必要的库 pip ins…...
Ceph集群搭建2025(squid版)
squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…...
机器学习实战(3):线性回归——预测连续变量
第3集:线性回归——预测连续变量 在机器学习的世界中,线性回归是最基础、最直观的算法之一。它用于解决回归问题,即预测连续变量(如房价、销售额等)。尽管简单,但线性回归却是许多复杂模型的基石。今天我们…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
【漫话机器学习系列】093.代价函数和损失函数(Cost and Loss Functions)
代价函数和损失函数(Cost and Loss Functions)详解 1. 引言 在机器学习和深度学习领域,代价函数(Cost Function)和损失函数(Loss Function)是核心概念,它们决定了模型的优化方向。…...
ThreadLocal为什么会内存溢出
每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...
