秒懂MVVM模式在Android中的应用

本文介绍了MVVM模式的概念,及其与MVC、MVP的关系。深入解析了MVVM的组成部分,包括视图、视图模型和模型,并讨论了Android通用架构准则,强调了关注点分离和模型驱动视图的重要性。最后,通过一个菜谱应用的实战例子展示了MVVM在Android开发中的应用,详细阐述了整体架构、Fragment、ViewModel和Repository的角色与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是MVVM模式

上世纪90年代,软件设计模式的超级大神Martin Fowler在MVC模式的基础上提出了MVP模式。经过若干年的发展,MVP模式又衍生出了MVVM(Model-View-ViewModel)模式。MVVM模式有助于将业务逻辑与视图完全分开,这为单元测试和后期代码维护提供了极大的便利。

MVC、MVP和MVVM之间的关系

搞清楚MVC、MVP和MVVM之间的关系,对于我们理解并应用MVVM模式有非常大的帮助。

MVC和MVP的关系

MVP模式是从经典的MVC模式演变而来的。因此,它们的基本思想有相通之处。例如,在这两个模式中,Controller和Presenter都负责业务逻辑的处理,Model则负责提供数据,最终View负责显示这些数据。它们最大的区别在于:在MVP模式中,View并不直接使用Model,它们之间的通信是通过Presenter来进行的。而在MVC模式中,View会直接从Model中读取数据,而不是通过Controller。MVC模式和MVP模式的架构图如下所示。
在这里插入图片描述

MVP和MVVM的关系

MVVM模式将Presenter改名为ViewModel,在整体上与MVP模式保持一致。它们唯一的区别在于,MVVM模式采用了双向绑定机制。因此,View的变动,会自动反映在ViewModel上,反之亦然。这样,开发者就不用手动侦听事件并触发相应的View的更新了,因为基于MVVM模式的应用框架已经帮我们做好了这方面的工作。MVP模式和MVVM模式的架构图如下所示。
在这里插入图片描述

深入理解MVVM模式

MVVM模式包含有三个参与者,它们分别是View(视图)、ViewModel(视图模型)和Model(模型)。MVVM模式的架构图如下所示。

在这里插入图片描述

视图

视图(View)负责在屏幕上显示用户界面。同时,视图也可以与用户进行交互,并负责接收用户的输入或操作。

视图模型

视图模型(ViewModel)是视图和模型之间的桥梁。当模型数据发生变化时,它负责通知视图更新用户界面。当用户与界面进行交互时,它负责接收用户输入并更新模型数据。这里的ViewModel与Android体系结构组件中的LiveData是不完全等价的。LiveData是ViewModel在Android上的具体实现,它可用通过生命周期来保存视图所使用的数据,从而优雅地支持屏幕旋转等Android平台特定的用户操作。

模型

模型是包含数据的非可视化类。模型的定义比较宽泛,它可以是数据传输对象,POJO(普通Java数据对象)或实体对象。获取模型时,应用程序通常需要访问网络服务、数据库或数据缓存。

Android通用架构准则

为了理解为什么MVVM模式非常适合Android应用的开发,我们需要首先了解一下Android通用架构的设计准则。

关注点分离

Activity和Fragment是Android系统与应用程序之间的接口,它们的生命周期完全是由操作系统来控制的。因此,操作系统可以根据用户交互或内存不足等原因,随时创建或者销毁Activity或Fragment。为了提供良好的用户体验和健壮的应用程序实现,应用程序本身应当最大程度地减少对Activity和Fragment的依赖。因此,在Activity或Fragment中加入业务逻辑是一个明显的错误。Activity和Fragment应当仅仅包含视图相关的逻辑,并负责系统级的交互。尽可能地精简Activity和Fragment可以有效地避免许多与应用生命周期相关的问题。这也是关注点分离原则所提倡的。

通过模型驱动视图

Android通用架构的另一个重要原则是通过模型驱动视图。模型是负责处理应用程序数据的组件。它们应当独立于应用程序中的视图组件,因此它们不受应用程序生命周期的影响。持久化的模型是最为理想的选择,原因如下:

  • 如果Android操作系统销毁了应用程序进程以释放资源,那么持久化的模型可用保证用户数据不会丢失;
  • 如果网络连接不稳定或不可用,应用程序仍然可用继续运行。

实战MVVM模式

可用看到,MVVM模式完全符合Android通用架构准则。接下来,我们就通过一个实际的例子,来感受一下MVVM模式是如何应用在Android应用开发中的。我们将要开发一个显示菜谱的应用。它包括两个界面,分别显示菜谱类别列表和菜谱列表。
在这里插入图片描述

整体架构

该应用采用MVVM模式,整体架构如下图所示。
在这里插入图片描述
可用看到,每个组件仅依赖它的下一级的组件。例如,Activity和Fragment仅依赖视图模型。Repository是唯一一个依赖多个其他组件的类。Repository通过访问持久化数据模型和网络数据源,为上层业务逻辑提供了一个一致透明的数据访问接口。

上述设计可以提供很好的用户体验。无论用户是在上次关闭应用程序后几分钟还是几天后返回应用程序,他们都会立即看到该应用程序在本地缓存的菜谱信息(我们将在后续文章中探讨本地缓存是如何实现的)。如果此数据是过时的,则应用程序的Repository模块将在后台更新数据。

Fragment

遵循Android单Activity的最佳实践,这个应用只包含一个MainActivity。根据当前显示的内容,MainActivity将显示CategoryListFragment或者RecipeListFragment。CategoryListFragment被用于显示菜谱类别列表,RecipeListFragment则被用于显示菜单列表。CategoryListFragment和RecipeListFragment是整个应用的视图。

CategoryListFragment负责响应用户的点击,并触发页面跳转。示例代码如下:

class CategoryListFragment 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值