android 架构设计之MVC MVP MVVM

android 架构设计之MVC MVP MVVM

移动端发展日新月异,技术更新也越来越快,最近想重新更改整理下安卓应用程序的架构,先整理下所需要的知识点,那就从老生常谈的MVC这些东西开始吧。

本文虽然参考了一些资料,但是还是参杂了自己的些许理解,可能存在错误与不足,还愿大家耐心指出,本人虚心求解。

  • MVC
  • MVP
  • MVVM

MVC

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

  • 控制器(Controller)- 负责转发请求,对请求进行处理。
  • 视图(View) - 界面设计人员进行图形界面设计。
  • 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

光说概念性的东西可能不是很直观,我就以android来说吧,其实android 很多设计是遵循MVC的,最典型的就是ListView、GridView这些用适配器的View,实现时,它的Adapter就是Controller层,ListView/GridView就是View层,数据源就是Model层。当然对于一个能看见的普通界面,我们也可以按照MVC来分下层,Activity就是Controller层,布局Layout就是View层,实体模型就是Model层。

MVC

对于MVC的示例图来说,我就简单放个最基本的图,因为在实际使用过程中,M、V、C之间的耦合关系并没有限定。也正是因为如此,所以很多时候为图方便,将大段的业务逻辑写在activity里面,activity既处理数据获取和业务逻辑,又控制页面展示与交互,长久就会造成一个activity里面的代码超过几千行。为了解决这种问题,我们接下来看看由MVC衍生出来的MVP。

MVP

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。同样对android来举例说明,使用MVP模式,可以把activity这些完全当作VIew层,只负责界面的处理,Presenter代替Controller层,处理各种逻辑,Model还是Model层。

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用!

android 架构设计之MVC MVP MVVM_第1张图片

对于MVP,我选择这张图,是因为这张图更好的说明了实现方法。Presenter和View之间用个自定义接口IView进行交互,这样可以方便单元测试。Presenter相当于View与Model之间的桥梁,不论是网络请求得到数据Model需要改变View,还是用户操作界面需要改变Model,都是通过Presenter来实现,View和Model之间没有直接联系。

至于android开发学习MVP,可以参考开源项目XDroidMvp

优点
1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
缺点
视图和Presenter的交互会过于频繁,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了,Presenter的维护也会变的麻烦。

在我看来,MVP模式主要是把以前没有划分明确的MVC之间的耦合关系定义的更明确了,M与V之间的联系,只能通过P来操作。但是这样会加重Presenter,当逻辑和交互变多后,Presenter也会变的难以维护。为了解决这种问题,我们接下来看看MVVM模式。

MVVM

MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。

android 架构设计之MVC MVP MVVM_第2张图片

android MVVM的发展,感觉应该是databinding的功劳,只要记住MVVM模式中,一个ViewModel和一个View匹配,它没有MVP中的IView接口,而是完全的和View绑定,所有View中的修改变化,都会自动更新到ViewModel中,同时ViewModel的任何变化也会自动同步到View上显示。而databinding就是让ViewMode和View匹配。

同样的,android开发学习MVVM,可以参考开源项目MVVMHabit

最后说下,在实际开发中,MVC、MVP、MVVM可能混合使用起来比单一使用更方便,具体还是看实际场景……

参考资料,参考但不局限以下链接
https://zh.wikipedia.org/wiki/MVC
https://baike.baidu.com/item/MVP%E6%A8%A1%E5%BC%8F/10961746?fr=aladdin
https://www.cnblogs.com/icebutterfly/p/7977033.html
https://blog.csdn.net/tklwj/article/details/80139095
https://github.com/limedroid/XDroidMvp.git
https://github.com/goldze/MVVMHabit.git

你可能感兴趣的:(android)