android mvc mvp mvvm
一.MVC
MVC是Model-View-Controller的缩写,从字面意思可以拆分成如下结构:
-
Model 模型:
封装了业务逻辑相关的数据以及处理方法 -
View 视图:
用于渲染页面,(对应了布局以及各类控件) -
Controller 控制器:
用于连接View和Model,处理流程以及页面之间的逻辑(对应了Activity及Fragment)
MVC的特点
它将数据、视图、控制分开,实现了松耦合。
- View将事件传递到Controller中
- Controller完成想要业务后改变Model状态
- Model更新View
MVC的优点
- 实现了解耦合,修改其中一层时,不用修改另外两层代码
- 可维护性高,松耦合也就意味着维护起来更加方便
- 重用性高
MVC的缺点
- 由于控件的数据绑定都需要在Activity中完成,Activity/Fragment在View与Controller的定义中有点模糊。
- 伴随着业务的增加,Controller容易变得臃肿。
二.MVP
MVP(Model-View-Presenter)是MVC的改良模式。与MVP一样,实现了视图、模型、控制的解耦,重点是改变的通信方式。
角色 | 说明 |
---|---|
Model | 主要做一些数据处理, 网路请求。Presenter 需要通过 Model 层存取、获取数据,Model是封装了数据库 Dao 层或者网络获取数据的角色,或者两种数据获取方式的集合。 |
Presenter | 交互中间人,核心逻辑,处理 View 的业务逻辑,沟通 View 和 Model 的桥梁,Presenter 持有的 View、Model 引用都是抽象,它从 Model 层检索数据后返回给 View 层,使得 View 和 Model 没有耦合,也将业务逻辑从 View 层抽取出来,经常会执行耗时操作。 |
View | 用户界面,Activity、Fragment 或者某个 View 控件,含有一个 Presenter 成员变量,通常 View 层需要实现一个逻辑接口,将 View 上的操作通过会转交给 Presenter 进行实现,最后 Presenter 调用 View 逻辑接口将结果返回给 View 元素。 |
MVP的特点
- View接受事件,传递给Presenter
- Presenter做逻辑处理,修改Model
- Model通知Presenter数据变化,Presenter更新View
MVP的优点
- 将Model与View完全分隔,提高了可扩展性。
- 便于测试。在测试Presenter时,只要实现View的接口并注入到Presenter就可以测试Presenter的业务逻辑。
MVP的缺点
- 与MVC一样,P层起到的控制功能伴随着业务的增多,也会变得臃肿。
- Presneter需要持有View的引用,同时View也需要持有Presenter的引用,控制上存在一定复杂度。
三.MVVM
MVVM实现了数据与UI的双重绑定,其中DataBinding是实现MVVM的关键工具。
- Model
与MVC和MVP一样,Model层保存了业务数据与处理方法 - View
对应Activity以及XML,但是比起MVC与MVP框架中的View层,更加简洁 - ViewModel
负责实现View与Model的交互,将两者分离
MVVM
MVVM的特点
- View接受事件,转交给ViewModel
- ViewModel操作Model更新数据
- Model更新后通知ViewModel,ViewModel更新View数据
MVVM的优点
- 低耦合。由于ViewModel的存在,View可以独立于Model变化与修改;同理,Model也可以独立于View变化与修改。
- 可重用性。一个ViewModel可被多个View重复绑定,实现同一组业务。
- ViewModel中解决了MVP中V-P互相持有引用的问题,使得结构更清晰,简洁
MVVM的缺点
- ViewModel持有Model的依赖。
- 数据绑定方式使得bug难以确定是在View中还是在Model中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通