✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)
🐳博客主页:开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN
🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。
🔥如需转载请参考【转载须知】
在Android应用程序的开发过程中,开发者们经常使用一些设计模式和架构,以确保代码的组织性、可维护性和可扩展性。本文将深入介绍三种常见的Android开发框架模式:MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel),以帮助您更好地理解这些模式的优势和使用场景。
文章目录
一. MVC(Model-View-Controller)
Model 模型 : 数据和业务逻辑的表示。处理应用程序的数据逻辑,负责数据的读写、验证和处理。
View 视图 : 用户界面的表示。负责展示数据和接收用户输入,但不处理数据的修改。
Controller 控制器 : 连接模型和视图的纽带。处理用户输入、更新模型和调整视图的显示。
MVC模式的优势在于分离关注点,但在Android中,它可能导致控制器变得庞大,难以维护。因此,MVC模式在Android开发中并不是最常用的模式。
优点:
- 分离关注点: MVC将应用程序划分为数据(模型)、用户界面(视图)和控制逻辑(控制器),使代码结构更加清晰。
- 灵活性: 可以轻松更改视图或模型,而无需修改其他部分。
缺点:
- 庞大的控制器: 随着应用程序规模增大,控制器可能变得庞大难以维护。
- 耦合度较高: 视图和控制器之间的耦合度较高,可能导致代码可读性差。
二. MVP(Model-View-Presenter)
Model 模型 : 与MVC中的模型相似,负责应用程序的数据逻辑。
View 视图 : 负责展示数据,与用户交互,但不处理数据的修改。
Presenter 表示器 : 连接模型和视图的桥梁。处理用户输入、更新模型并决定如何更新视图。
MVP模式通过将控制逻辑从视图中分离,降低了代码的复杂性,提高了可测试性。Presenter处理所有业务逻辑,而视图只负责用户界面的展示。
优点:
- 业务逻辑分离: MVP通过将业务逻辑(Presenter)与用户界面(视图)分离,提高了代码的可测试性。
- 可维护性: 更容易维护和修改,因为业务逻辑单一且分离。
缺点:
- 仍存在耦合: 视图和业务逻辑之间的交互仍然存在耦合,不如MVVM模式中的解耦程度高。
三. MVVM(Model-View-ViewModel)
Model 模型 : 与MVC和MVP中的模型相同。
View 视图 : 负责展示数据,但与MVP不同,视图直接与ViewModel交互。
ViewModel 视图模型 : 连接模型和视图的中介。负责处理视图的展示逻辑,从而使视图与模型解耦。
MVVM模式在Android中广泛应用,它通过使用数据绑定技术,使视图和视图模型之间的同步更为简便。ViewModel负责处理所有用户界面的逻辑,而视图则负责展示数据。
优点:
- 解耦程度高: MVVM通过使用ViewModel作为中介,实现了视图和模型的解耦。
- 数据绑定: 使用数据绑定技术,使视图与ViewModel同步更为简便。
- 可维护性: 由于解耦,更易于维护和测试。
缺点:
- 学习曲线: 相对于MVC和MVP,MVVM有一定的学习曲线。
- 不适用于小型项目: 对于小型项目,引入MVVM可能显得过于繁琐。
MVC到MVP再到MVVM的发展
MVC被认为是解决用户控制大型和复杂数据集问题的通用解决方案。从经典MVC到MVVM,UI架构经过数次重大变迁,一些概念也在不断变化,架构和底层环境互相影响、适配,我认为时至今日,经典MVC已经不再是UI架构的正常选项。
最初是Thing、Model、View、Editor。后来经过讨论定为Model、View和Controller。
在70年代末,80年代初,我们并没有操作系统和消息循环,甚至鼠标的光标都需要我们的UI系统来自行绘制。假如我们面对的是鼠标、键盘驱动这样的底层环境,我们就需要一定的机制和系统来统一处理用户输入,实现指针系统,文本系统,焦点系统,并且分配给正确的view或者model来处理。这样也就不难理解为什么经典MVC中称controller是用户和系统之间的链接。
Model-View-Presenter是在MVC的基础上,进一步规定了Controller中的一些概念而成。
MVVM认为view应该是事件驱动,模型变化只是一种事件。
如何呈现是view的事,调用方只用给view一个data,view就只负责这个data的显示,调用者不用管view如何显示,只负责将data传递,view也不用管数据从何而来,只要将data以自己的方式呈现,并且时刻关注data的变化如何反映到view上来就好。
而双向绑定,则是一个附加产品,毕竟只有像textbox,form等会改变数据的UI不多,大部分UI都只是单向的呈现数据而已。不过有双向绑定在,则可以将view和调用方分离得更彻底,即获取数据不必在意特别的view,如一个日期是用户在textbox中输入,还是用calendar提取的无关紧要,因为那是view设计和安排的事。
Model 无法将数据“发送”给 View,因为它根本不知道 View 的存在,数据应该是由 Controller 持有,并显示出 View。因此,用户也不是直接操作 Controller,即使是输入 URL,也可以认为那是由 View 触发的(就像在 View 上点击了一个链接)。
因此,MVC 的处理流程是 V -> C -> M -> C -> V。
MVP 模式实际上就是 MVC,只不过这里面的 C 主要负责的不再是业务逻辑,而是界面逻辑了,比如何时显示/隐藏某个选项卡,绑定 View 事件等。
结论
- MVC: 适用于小型项目,有分离关注点的优势,但可能导致控制器庞大难以维护。
- MVP: 适用于中等规模的项目,通过分离业务逻辑提高了可测试性,但仍有一定的耦合。
- MVVM: 适用于大型、复杂的项目,通过数据绑定实现了视图和模型的高度解耦,但需要面对学习曲线。
选择适合项目的模式通常取决于项目的规模、需求和团队的经验。MVC、MVP和MVVM都有各自的优势和适用场景。MVC模式适合小型项目,MVP模式适用于中等规模项目,而MVVM模式则在大型、复杂的项目中表现得更为出色。
通过深入理解这些模式的优缺点,开发者可以更好地选择适合项目需求的架构,提高代码的可维护性和可扩展性。
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠
无论是哪个阶段,坚持努力都是成功的关键。不要停下脚步,继续前行,即使前路崎岖,也请保持乐观和勇气。相信自己的能力,你所追求的目标定会在不久的将来实现。加油!