MVVM 基础

news2024/11/13 9:39:01

文章目录

        • MVC 设计模式
          • 传统的 MVC 架构
          • Cocoa version of MVC
          • MVC 设计模式的几个指导原则
        • MVVM 设计模式
          • IOS 上的应用
          • 鸿蒙上 MVVM
          • Android Data binding
        • 参考:

MVC 设计模式

日常大家都会听到,名字很简单,但是很实用,日常 Android 工程开发基本都会用到,但是仔细了解下,其实也会有很相对于原来基本了解的扩充。MVC (Model–view–controller)架构将程序分为:

  • Model :程序定义的基础数据模型,和用户的界面显示部分相互独立
  • View:展示信息以及获取用户交互的输入,数据信息来源于 Model
  • Controller:Tie the Model to the View。连接 View 和 Model ,负责逻辑部分处理

MVC 架构将应用程序中的角色分为 M V C 三个部分,这样的橘色拆分定义了角色,同时也为模块之间划分了边界,各个模块通过边界定义的接口去进行通信,角色划分之后,模块之间的组合方的不同,也会有不同的 MVC 模式。

传统的 MVC 架构

图上的逻辑资料参考 Apple 官网 的文档

在上面的 MVC 架构中,基本的流程如下:

  • 用户操作界面,产生相应的交互事件,事件会传递到 Controller 中。
  • Controller 中根据事件的类型,决定是去更新 Model 还是改变 View 的i行为
  • Model 改变了已有回去将数据变化通知到 Observer 中。

自己在看 Apple 的官方文档时,有这样一段描述,文档中介绍 View 模块中,也是对 组合(Composite)模式的使用,确实:在 View 模块中,View 视图会相互嵌套组合,界面上展示的 View 基本都是由多个 View 组合而成。
而 Controller 中侧采用了策略模式,Controller 决定了 View 界面背后的执行的逻辑,View 只负责界面 UI 部分。。
而 Model 则是 观察者(Observer)模式,将数据的变化通知到对应的监听者上。
这种 设计模式
优点:

  • 一定程度上可以进行代码的复用,提高工程效率。
  • 以 MVC 的模块划分方式,将边界职责定义清楚,模块间低耦合,方便功能扩展。
  • 通用性好:Web、移动端、桌面端都可以使用。

缺点:
-实际开发时 Controller 逻辑一般会变得过重(有过相关开发的同学都会发现 Activity/Controller 中的逻辑部分代码很多),因此有了 Massive View Controller 之称,实际上。

  • Model 和 View 之间相互耦合,降低了代码的复用性,最好将两者独立。
Cocoa version of MVC

在这里插入图片描述
上图中新的 MVC 架构在交互上更加简洁。在上图中新的 MVC 架构中,Controller 新增加了作为作为中介者(Mediator),协调两个方向上的数据,而 View 则增加了 Command 模式用于实现 IOS 上的 target-action 机制。

MVC 设计模式的几个指导原则
  • 将 MVC 三个角色的代码不要写在一个类中,实现角色实现代码的分离
  • 尽可能的复用 Model 和 View 代码。
  • View 不要直接去监听 Model 数据的变化,通过 Controller 中介控制器去中转。
  • View Class 中的代码不应该依赖具体的 Model Class 和 Controller。
  • Model Class 不应该依赖除了 Model Class 以外的任何类。
MVVM 设计模式
IOS 上的应用

MVVM 基于 上面新的 Cocoa version MVC 架构的基础上,将数据表示部分的代码进行抽象,形成 ViewModel 部分,就可以得到下面的架构图。
在这里插入图片描述

图片来源 https://www.objc.io/issues/13-architecture/mvvm/

将 Model 的解析到 View 的映射逻辑放到 View Model 中,我们可以实现原本 View Controller 中代码的减少,同时,我们也可以不实例化 Controller 对 View Model 中的逻辑进行测,具体的 IOS 代码可以参考这篇文章。

https://objccn.io/issue-13-1/?spm=ata.21736010.0.0.71477536QNJw1y

鸿蒙上 MVVM

在鸿蒙上的 UI ,是使用 ViewModel 的方式控制页面数据渲染的,在鸿蒙官网有下面的图示来表示
https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/quick-start/arkts-mvvm.md
在这里插入图片描述
鸿蒙的上的 UI 驱动需要更改数据 Model 的方式,具体可以查看鸿蒙官网的状态管理部分,该部分有很多对应的讲解。

Android Data binding

Android 中一直没有接触过 Data Binding,了解后发现也是对 MVVM 的实践,可参考下面 Android 部分的参考链接。

参考:

apple 官方 MVC 介绍 :
https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html#//apple_ref/doc/uid/TP40010810-CH14-SW14

https://www.cnblogs.com/dxy1982/p/3793895.html?spm=ata.21736010.0.0.ca165ef36DPnBD
Android Data binding MVVM github 教程,
https://github.com/liangfeidotme/MasteringAndroidDataBinding?tab=readme-ov-file
MVVM ios 中的使用场景介绍:
https://objccn.io/issue-13-1/?spm=ata.21736010.0.0.71477536QNJw1y
Krush iOS Architecture
https://teehanlax.com/blog/krush-ios-architecture/
https://www.cnblogs.com/dxy1982/p/3793895.html?spm=ata.21736010.0.0.ca165ef36DPnBD

Android 知识库:
应用架构:
https://developer.android.com/topic/architecture?hl=zh-cn
Android Data binding:
https://developer.android.com/codelabs/android-databinding#0

android databinding 教程
https://developer.android.com/topic/libraries/data-binding/expressions?hl=zh-cn#java
设计模式 汇总篇:https://blog.csdn.net/ShuSheng0007/article/details/115980889

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

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

相关文章

紧急警报 工厂水泵房深夜意外进水:物联网监控如何避免百万损失

紧急警报!工厂水泵房深夜意外进水:物联网监控如何助力避免百万损失 在当今高度自动化的工业生产环境中,任何微小的异常都可能迅速升级为重大的安全事故,对企业的运营造成不可估量的影响。近期,一起发生在某大型制造工…

数据挖掘实战-基于朴素贝叶斯算法构建真假新闻分类模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

外包干了半年,快要废了。。。

先说一下自己的情况,普通本科,在外包干了半年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会让…

10个登录页面优化的案例研究和示例,激发你的灵感

什么是落地页优化,为什么它很重要? 落地页优化是一门将首次浏览转化为行动(即转化率)的艺术和科学。其主要目的是调整和微调您的数字欢迎界面,让每一位访问者都感受到这是为他们量身打造的。 这个过程不仅仅是简单的…

电脑监控软件系统有哪些?|2024年干货整理,赶紧码住!

在一家知名互联网公司里,由于缺乏有效的监管措施,一些员工利用工作时间进行与工作无关的活动,如网购、观看视频、玩游戏等小技怠工的情况,这种现象被称为“摸鱼”。 尽管表面上看似无害,但长期下来却严重拖累了整个团队…

Chisel简明教程

1. 简介 Chisel(Scala嵌入式硬件构造语言)是一种嵌入在高级编程语言Scala中的硬件构造语言。Chisel是一个特殊类定义、预定义对象和Scala内部使用约定的库,因此当你编写Chisel代码时,实际上是在编写一个构建硬件图的Scala程序。随…

也谈PCIe带宽问题

每每谈到PCIe速率的时候,必不可少要谈论的就是PCIe的带宽问题。互联网上也有很多帖子在谈这个事情,但总觉得差那么点意思。我从几个维度来讨论我的理解,希望有些信息能带给大家不一样的看法。先贴张PCIe速率提升图。 理论带宽、实际带宽、带宽…

掌握Transformer之学习各组件

01 引言 这是我关于Transformer系列的第二篇文章。在前一篇文章中,我们了解了Transformer结构的功能、相关架构及其相比于RNN架构的优势。在本文中,我们可以深入了解Transformer结构的工作原理。我们将通过实际的矩阵表示来了解数据如何在该结构内流动…

如何构建高效快速的数据同步策略方案

在数据化的商业环境中,实现数据的实时同步不仅是提升企业内部协作效率的关键,更是确保业务决策精准性和时效性的核心要素。通过确保数据的一致性和最新性,企业能够实现跨部门的无缝协作,从而为业务流程的顺畅运作和快速响应市场变…

比 GPT-4 便宜 187 倍的Mistral 7B (非广告)

Mistral 7B 是一种设计用来快速处理较长文本的人工智能模型。它采用了一些特别的技术来提高速度和效率,比如“分组查询注意力(grouped-query attention)”和“滑动窗口注意力(sliding-window attention)”。 这些技术…

python中如何打印日志信息推荐logaid库(强大的日志库)

一、安装 pip install logaid二、使用 只打印,不保存 from logaid import loglog.info(hello world) log.error(hello world) log.warning(hello world) log.fatal(hello world,123,{},[],False)开启超级print from logaid import log log.init(print_proTrue)prin…

长沙自闭症寄宿学校推荐,为孩子开启光明未来

在长沙这座历史悠久而又充满活力的城市中,自闭症儿童的成长与教育问题牵动着无数家庭的心。家长们渴望为孩子找到一所能够提供专业康复、温馨关怀与全面教育的学校,为他们的未来铺设一条光明之路。虽然本文起始于长沙的期盼,但我们的目光已跨…

多态(上)【C++】

文章目录 多态的概念多态的实现多态产生的条件什么是虚函数?虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写? 多态的概念 C中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口…

UE4_后期处理六—夜视仪、扫描线

参考:在虚幻引擎中混合材质函数 | 虚幻引擎 5.4 文档 | Epic Developer Community (epicgames.com) 效果: 知识储备: 混合材质函数: 这些函数用于将一种颜色与另一颜色混合,这类似于PS中的混合模式。 混合 是一种函数类型,这类…

因MathType导致word复制粘贴失败,显示:运行时错误‘53’

问题:运行时错误‘53’:文件未找到:MathPage.WLL 解决方法:打开MathType所在文件夹 右击MathType图标->点击“打开文件所在位置”->找到MathPage.WLL文件。 然后,把这个文件复制到该目录下:C:\Progr…

UE5-俯视角色移动(蓝图)01

效果如下: 蓝图节点如下: 使用示例自带的移动蓝图,发现角色只能平移,不会转向。必须勾选以下选项: 点击蓝图-》组件-》SpringArm节点。在细节中找到摄像机设置,勾选以下: 在 点击蓝图-》组件-…

智能化大数据平台引领企业迈向精准决策时代

随着科技的飞速发展,大数据平台正逐步迈向更加智能化和自动化的未来趋势。未来的数据平台不仅仅是一个简单的存储和处理数据的工具,而是一个能够自主学习、优化和做出决策的智能系统。这一转变将极大地改变企业处理数据的方式,提高决策的速度…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

[机器学习]逻辑回归

1 前置知识 逻辑回归解决二分类问题。sigmoid函数:非线性,值域(0,1)概率值 2 逻辑回归原理 3 癌症分类案例 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import Standa…

Python爬虫案例七:抓取南京公交信息数据并将其保存成excel多表形式

测试链接: https://nanjing.8684.cn/line4 思路:先抓取某个类型下的某一条线路所有数据,然后实现批量,,列举出三个类型代表既可 源码: from lxml import etree from xlutils.copy import copy import requests, os, xlrd, xlwtd…