Android MVC、MVP、MVVM理解

项目架构的理解:

项目架构个人理解就是项目整体结构。

传统java web项目,通过使用框架的方式,把项目搭建好。例如使用SSM框架搭建web项目。

对于Android来说,我们本身代码就在Android 系统之上。我们写App时,需要遵循Android SDK之中的API。例如我们在Activity生命周期之中书写相应的方法。
在这里插入图片描述
也就是说,对于那些简单的软件,或者不是以商业为目的的软件,不需要对架构特别的关注。例如,Android原生系统中的系统应用,计算器,日历等,更新相对没那么频繁。相对于商业软件架构没有那么明确。
商业软件,如果不要架构。那么对于不同的人,可能代码风格不同,风格不统一看不懂,对团队开发不利。项目越来越大,需求改动也会越来越麻烦,慢则一个月更新一次,快则单周一次更新,风险越来越高。

Android架构也是不断的迭代,从开始的MVC,再到MVP,再到MVVM
个人理解这样架构是因为app的不断发展,也是发掘App的更多的可能。现在各个公司尽可能的将App做成平台。一个App已经已经不是Android系统刚出来的时候仅仅是一个工具类型App。

MVC

图片来自维基百科
上图来自维基百科英文版。

View:视图显示,对应于布局文件
Controller:对应于Activity,逻辑控制,例如按钮逻辑处理
Model:业务逻辑和实体模型

在Javaweb后台代码中。 框架本身有很强的MVC规则。例如Struts规定框架中Model,View,Controller应该怎么写,根据这个写法,就能写出很好的架构。

在移动端,并没有在Android SDK中定义MVC真正应该怎么写,大多数情况下一开始的MVC也是借鉴其他技术方向经验。

Android理想情况下:

MVC将Xml看成View Activity看成Controller 从网络或者数据库获取的数据为Model。

实际

vc—m 也就是说

View依赖于Controller
View存有model引用,model存有View引用。
xml中书写视图代码。我们知道,xml中的创建,Activity也可以书写创建布局。造成Activity既是View又是Controller。

结果:Android中大部分逻辑都写在了Activtiy中。

在这里插入图片描述

MVP

在这里插入图片描述
上图中MVP通过Presenter,将View和Model完全的隔离。

MVP是MVC的演进。

View:对应于Activity和xml,负责View的绘制以及与用户交互。
Presenter: 负责完成View于Model间的交互,
Model:业务逻辑和实体模型

结果:
Activity和presenter以接口形式进行解耦
将activity中的逻辑加载至presenter中。 这样避免了activity直接和数据打交道。
也就是view和model不发生关系。

MVP构造APP:

Building MVP apps

优点

  • 也就是view和model不发生关系。
  • Actvity不再像以前那么臃肿

缺点:

  • presenter接口过多或者过少无法控制。
  • MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期(是否已经销毁等)。
  • MVP是以UI和事件为驱动的传统模型,数据都是被动地通过UI控件做展示,但是由于数据的时变性,我们更希望数据能转被动为主动,希望数据能更有活性,由数据来驱动UI。
  • V层与P层还是有一定的耦合度。一旦V层某个UI元素更改,那么对应的接口就必须得改,数据如何映射到UI上、事件监听接口这些都需要转变,牵一发而动全身。如果这一层也能解耦就更好了。
    复杂的业务同时也可能会导致P层太大,代码臃肿的问题依然不能解决。

MVVM

在这里插入图片描述

View: 对应于Activity和XML,负责View的绘制以及与用户交互。
Model: 实体模型。
ViewModel: 负责完成View与Model间的交互,负责业务逻辑。

在前端框架中React,vue对MVVM进行了很好的实践。
后期谷歌推出Android Architechture components,Jetpack (一套库可帮助开发者更轻松地编写优质应用)对架构方面进行推进。

MVVM的最本质就是以数据为驱动。

在常规的开发模式中,数据变化需要更新UI的时候,需要先获取UI控件的引用(findViewById),然后再更新UI.这个是以UI和事件为驱动的传统模型

在MVVM中,这些都是通过数据驱动来自动完成的,数据变化后会自动更新UI,UI的改变也能自动反馈到数据层,数据成为主导因素。这样MVVM层在业务逻辑处理中只要关心数据,不需要直接和UI打交道,在业务处理过程中简单方便很多

Databinding 实现数据和UI绑定.

你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
在Android中,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化

以前Activity、Fragment中需要把数据填充到View,还要进行一些视图逻辑。现在这些都可在布局中完成.甚至都不需要再Activity、Fragment去findViewById。这时候Activity、Fragment只需要做好的逻辑处理就可以了。

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller#History
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter#cite_note-8
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

发布了93 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/sxj159753/article/details/97304447