MVVM 基础
文章目录
- 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