iOS--理解MVC与MVVM

MVC

MVC 是一种将应用程序分为三部分的架构模式:Model(模型)、View(视图)、Controller(控制器)。每部分负责不同的职责,使代码更加模块化、易于维护。

Model:负责业务数据的管理,包含业务数据的结构和逻辑。以及数据存储。

View:负责界面的展示和用户交互。

Controller:负责连接 Model 和 View,处理用户输入并更新 Model 和 View。

其中ControllerModel和View的桥梁,见下图:

整个框架的设计最优结构是View层不依赖Controller层而独立存在,Model层不依赖Controller层和View层独立存在,Controller层负责关联二者,View层只负责展示,Model层持有数据和业务的具体实现,而Controller层则处理事件响应以及业务的调用以及通知界面更新。三者之间一定要明确的定义为单向依赖,而不应该出现双向依赖

Swift demo

import UIKit// Model: 数据结构
struct User {let name: Stringlet age: Intfunc isAdult() -> Bool {return age >= 18}
}// View: 展示用户信息
class UserView: UIView {private let nameLabel = UILabel()private let ageLabel = UILabel()override init(frame: CGRect) {super.init(frame: frame)setupView()}required init?(coder: NSCoder) {super.init(coder: coder)setupView()}private func setupView() {addSubview(nameLabel)addSubview(ageLabel)// ...布局代码省略}func updateView(name: String, age: Int) {nameLabel.text = "Name: \(name)"ageLabel.text = "Age: \(age)"}
}// Controller: 连接 Model 和 View
class UserController: UIViewController {private let userView = UserView()private var user: User?override func viewDidLoad() {super.viewDidLoad()view.addSubview(userView)// ...布局代码省略// 设置 Model 并更新 ViewuserView.updateView(name: "Alice", age: 25)}
}

好处:提高开发效率,简化操作

坏处:

• UIViewController 变得过于臃肿,因为它承担了太多职责。

• View 和 Controller 间的耦合度较高,难以测试。

MVP

MVP 是一种改进的 MVC 设计模式,它通过 Presenter 更清晰地管理 View 和 Model 之间的交互。MVP 中 View 和 Model 的依赖关系较少,逻辑处理更加集中在 Presenter 中。MVP 模式通过引入 Presenter 进一步解耦,将业务逻辑与视图更新独立出来。具体来说:

Model:负责数据处理和业务逻辑,与 MVC 中的 Model 类似。它处理所有与数据相关的操作,比如获取、保存和更新数据。

View:只负责显示 UI 和用户的输入,尽可能简单。它不直接与 Model 交互,而是通过 Presenter 进行通信。View 不包含任何业务逻辑。

Presenter:是 View 和 Model 的中间层,负责从 Model 获取数据并传递给 View,同时处理用户输入和更新 Model。Presenter 不依赖于具体的 UI 框架,因此更易于测试。

结构如下:

在 MVP 中,View 非常轻量,几乎不包含任何业务逻辑。所有与 View 相关的业务逻辑都交给 Presenter 来处理。View 和 Model 之间没有直接交互,所有交互都通过 Presenter。

优点

• Presenter 不依赖具体的 View,实现了业务逻辑的分离,增强了代码的可测试性。

缺点

• 由于通过协议来定义 View,会带来额外的代码复杂度。

MVVM

MVVM 是一种更注重数据绑定和解耦的架构模式,分为三部分:Model(模型)、View(视图)、ViewModel(视图模型)。其中视图模型(ViewModel)其实就是MVP模式中的P

Model:和 MVC 中类似,负责数据管理。

View:负责界面的展示。

ViewModel:负责处理 Model 和 View 的逻辑,通常包含数据的转换、绑定等,使 View 更加轻量化。

swift demo

ViewModel & Model

import Foundationprotocol ViewModelDelegate: AnyObject {func didUpdateData(_ viewModel: ViewModel)
}class ViewModel {weak var delegate: ViewModelDelegate?private var model: Modelvar displayText: String {return "Hello, \(model.name)"}init(model: Model) {self.model = model}func updateName(to newName: String) {model.name = newNamedelegate?.didUpdateData(self) // 通知 View 数据已更新}
}class Model {var name: Stringinit(name: String) {self.name = name}
}

ViewController (View)

import UIKitclass ViewController: UIViewController, ViewModelDelegate {private var viewModel: ViewModel!private let nameLabel = UILabel()private let changeButton = UIButton(type: .system)override func viewDidLoad() {super.viewDidLoad()// 初始化 Model 和 ViewModellet model = Model(name: "World")viewModel = ViewModel(model: model)viewModel.delegate = selfsetupUI()updateUI()}private func setupUI() {view.backgroundColor = .whitenameLabel.translatesAutoresizingMaskIntoConstraints = falseview.addSubview(nameLabel)nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = truenameLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = truechangeButton.setTitle("Change Name", for: .normal)changeButton.translatesAutoresizingMaskIntoConstraints = falseview.addSubview(changeButton)changeButton.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 20).isActive = truechangeButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = truechangeButton.addTarget(self, action: #selector(changeName), for: .touchUpInside)}@objc private func changeName() {viewModel.updateName(to: "MVVM")}private func updateUI() {nameLabel.text = viewModel.displayText}// ViewModelDelegate 方法,ViewModel 数据变化时触发func didUpdateData(_ viewModel: ViewModel) {updateUI()}
}

优点

• View 和业务逻辑的完全分离,增强了代码的可测试性。

• 数据绑定使得 UI 更新非常方便。

缺点

• 初期代码复杂度较高,尤其是在没有使用响应式编程的情况下。

参考:

https://medium.com/@wanghaonanlpc/mvc-vs-mvp-vs-mvvm-bfcf7568aac0

iOS简单理解区分MVC、MVP、MVVM_ios mvvm-CSDN博客

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

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

相关文章

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip: 127.0.0.1, port:8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

Java | Leetcode Java题解之第472题连接词

题目&#xff1a; 题解&#xff1a; class Solution {Trie trie new Trie();public List<String> findAllConcatenatedWordsInADict(String[] words) {List<String> ans new ArrayList<String>();Arrays.sort(words, (a, b) -> a.length() - b.length(…

PyQt 的Tree Widget中拖放和点击的异常行为

在 PyQt 的 QTreeWidget 中&#xff0c;如果你遇到 拖放 和 点击 的异常行为&#xff0c;可能是由于信号处理、事件拦截、拖放设置或树结构配置等问题导致的。以下是一些可能的常见问题和解决方案。 1、问题背景 一个 PyQt 应用程序中包含两个 Tree Widget&#xff0c;当用户从…

QUUID 使用详解

UUID 通常由 128 位&#xff08;16 字节&#xff09;组成&#xff0c;通常表示为 32 个十六进制数字&#xff0c;分为五个部分&#xff0c;格式如下&#xff1a; QUuid 是 Qt 框架中用于生成和处理 UUID&#xff08;通用唯一标识符&#xff09;的类。UUID 是一种标准的标识符格…

(27)QPSK信号在非相关平坦莱斯(Rician)衰落信道上的误码率性能MATLAB仿真

文章目录 前言一、Rician衰落信道模型的MATLAB代码二、在非相关的平坦Rician衰落信道上传输QPSK符号模型1.MATLAB仿真代码2.仿真结果 前言 本文首先给出莱斯衰落信道的建模函数&#xff0c;然后基于该函数给出在非相关的平坦Rician衰落信道上传输QPSK数字调制符号的MATLAB仿真…

6. 继承、重写、super、final

文章目录 一、重新定义需求二、继承1. 继续分析2. 概念3. 代码① 父类② 子类③ 测试结果 4. 饿狼传说之多层继承① 概念② 代码 5. 多继承 三、方法的重写1. 情境2. 代码① 吃什么② 怎么叫(Override重写) 3. 小结 四、super1. 啃老2. 啃老啃到底 五、final1. 用途及特征2. 举…

快速解决urllib3.exceptions.MaxRetryError: HTTPSConnectionPool

正题 使用pip命令查看urllib3版本 pip list发现版本为 1.26.9 urllib3 v1.26.9此时如下报错&#xff0c;无法正常使用&#xff08;使用了代理&#xff09; urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hostxxx.xxxxx.com, port443): Max retries exceeded wit…

智能的三大问题:何以、所以、可以

智能具有三大问题&#xff0c;即何以、所以、可以。“何以&#xff08;Why&#xff09;”涉及探讨智能的本质及其产生的原因。智能是什么&#xff1f;它的定义和特征是什么&#xff1f;为什么人类或机器需要智能&#xff1f;它如何帮助我们解决复杂问题、做出决策和适应环境&am…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…

科研绘图系列:R语言绘制SCI文章图2

文章目录 介绍加载R包导入数据图a图b图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码 加载R包 library(ggplot2) library(dplyr) library(readxl) library(ggpmisc)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度网盘下载链接: https://pan.baid…

2024年软件设计师中级(软考中级)详细笔记【3】数据结构(下)(分值5分)

上午题第3章数据结构下部目录 前言第3章 数据结构【下】(5分)3.5 查找3.5.1 查找的基本概念【考点】3.5.2 静态查找表的查找方法3.5.3 动态查找表3.5.4 哈希表3.5.4.1 哈希表的定义3.5.4.2 哈希函数的构造方法3.5.4.3 处理冲突的方法 3.6 排序3.6.1 排序的基本概念3.6.2 简单排…

Java 获取热搜并生成图片

效果图如下&#xff1a; 第一步获取热搜 public List<String> getHotNews4(Integer size) {if (size < 0 || StringUtils.isEmpty(size)) {return null;}try {//set 转listreturn new ArrayList<>(getHotNews(size));} catch (Exception e) {logger.error(&qu…

Java 集合 Collection常考面试题

理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…

Java控制台实现《多线程模拟龟兔赛跑》(实现Runnale接口,重写run()方法)

&#xff08;温馨提示&#xff1a;本题最重要的是学习思路&#xff0c;代码还有待优化和改进&#xff01;&#xff09; 下一篇博客进行优化。实现Callable接口&#xff1a;V call() throws Exception 。可以返回结果&#xff0c;以及可以抛出异常。&#xff08;启动线程比较麻烦…

JavaSE——集合2:List(Iterator迭代器、增强for、普通for循环遍历集合)

目录 一、List (一)List接口基本介绍 二、List接口的常用方法 三、List集合的三种遍历方式 四、小练习——使用冒泡排序遍历集合 一、List (一)List接口基本介绍 List接口是Collection接口的子接口 public interface List<E> extends Collection<E> List集…

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

高质量SCI论文撰写及投稿丨论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等----AI强大功能

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从选题到投稿的全过程&#xff0c;提高论文撰写效率与…

区块链积分系统:重塑支付安全与商业创新的未来

在当今社会&#xff0c;数字化浪潮席卷全球&#xff0c;支付安全与风险管理议题日益凸显。随着交易频次与规模的不断扩大&#xff0c;传统支付体系正面临前所未有的效率、合规性和安全挑战。 区块链技术&#xff0c;凭借其去中心化、高透明度以及数据不可篡改的特性&#xff0c…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…