三种架构形式

MVC

MVC全名为Model-View-Controller,图解如下

浅谈下mvc和mvp、mvvm到mvvm+Jetpack

  • View:担任与用户交汇,显现界面。
  • Controller:担任接收来自view的恳求,处理事务逻辑。
  • Model:担任数据逻辑,网络恳求数据以及本地数据库操作数据等。

在MVC架构中,Controller是事务的首要承载者,简直一切的事务逻辑都在Controller中进行编写。而View首要担任UI逻辑,而Model是数据逻辑,彼此分工。

MVC的实质就是依照UI、事务、数据不同的职责分三大模块,彼此分工。

可是一般的开发中

  • 简直一切的事务逻辑代码都在controller中进行,会导致十分臃肿,降低项目的可测验性与可维护性
  • view直接持有controller和model实例,不同职责的代码进行耦合,导致代码耦合性高,模块分工不清晰。

MVC好处:简略。他不需求写许多的代码来让代码解耦,这在在初创公司的小型项目十分有用。小型项目总体的代码量级小,能够进步开发效率

MVP

MVP全名是Model-View-Presenter。图解如下:

浅谈下mvc和mvp、mvvm到mvvm+Jetpack

  • View:UI模块,担任界面显现和与用户交汇。
  • Presenter:担任事务逻辑,起着连接View和Model桥梁的效果。
  • Model:专心于数据逻辑。

MVP和MVC的差异很明显就在这个Presenter中。为了处理MVC中代码的耦合严重性,把事务逻辑都抽离到了Presenter中。这样View和Model完全被阻隔,完成了单向依靠,大大减少了耦合度。view和prensenter之间经过接口来通讯。

不同的view能够经过完成相同的接口来同享prensenter。presenter也能够经过完成接口来完成动态更换逻辑。Model是完全独立开发的,向外露出的方法参数中含有callBack参数,能够直接调用callBack进行回调。

  • MVP经过模块职责分工,抽离事务逻辑,降低代码的耦合性
  • 完成模块间的单向依靠,代码思路清晰,进步可维护性
  • 模块间经过接口进行通讯,降低了模块间的耦合度,能够完成不同模块独立开发或动态更换

MVP的最大特点就是接口通讯,接口的效果是为了完成模块间的独立开发。presenter的效果就是承受view的恳求,然后再model中获取数据后调用view的方法进行展现,由于每个界面都是不同的,这就导致了每个Activity/Fragment都必须写一个IView接口,然后还需求再写个IPresenter接口,然后产生了十分多的接口,需求编写大量的代码来进行解耦。 其次,prensenter并没有真正解耦,他还需求调用view的接口进行UI操作,解耦没有完全。

因此,MVP缺点有:

  • 过度设计导致接口过多造成了接口地狱的问题,编写大量的代码来完成模块解耦,降低了开发效率
  • 并没有完全进行解耦,prensenter需求一起处理UI逻辑和事务逻辑,presenter臃肿

MVVM
终于到了MVVM,或许许多人都感觉“卧槽这么牛逼的架构我必定学不会”然后被劝退了持续运用MVC或许MVP。在我看来,MVVM和上面两种架构形式相同都是一种架构思想,仅仅谷歌推出了jetpack架构组件来让咱们更好的运用这种架构形式。

MVVM,全名为Model-View-ViewModel。图解:

浅谈下mvc和mvp、mvvm到mvvm+Jetpack

  • View:和前面的MVP、MVC中的View相同,担任UI界面的显现以及与用户的交汇。
  • Model:同样是担任网络数据获取或许本地数据库数据获取。
  • ViewModel:担任存储view的数据映像以及事务逻辑。

MVVM的view和model和前面的两种架构形式是差不多的,重点在ViewModel。viewModel经过将数据和view进行绑定,修改数据会直接反映到view上,经过数据驱动型思想,完全把MVP中的Presenter的UI操作逻辑给去掉了。而viewModel是绑定于单独的view的,也就不需求进行编写接口了。但viewModel中仍旧有许多的事务逻辑,可是由于把view和数据进行绑定,这样能够让view和事务完全的解耦了。view能够专心于UI操作,而viewModel能够专心于事务操作。因而:

  • MVVM经过数据驱动型思想,完全把事务和UI逻辑进行解耦,各模块分工职责清晰。

View只需求重视Viewmodel的数据部分,而无需知道数据是怎样来的;而ViewModel只需求重视数据逻辑,而不需求知道UI是如何完成的。View能够随意更换UI完成,但ViewModel却完全不需求改动。

但仍旧存在的问题是:viewModel会仍旧很臃肿;上手也有必定的难度。

  • MVVM的viewModel仍旧很臃肿。
  • MVVM需求学习数据绑定结构,具有必定的上手难度。

为了处理上面两个问题,google推出了上手难度相对较低的mvvm+Jetpack结构

浅谈下mvc和mvp、mvvm到mvvm+Jetpack

做个简略的解析:

  • View对应的就是Activity和Fragment,在这里进行UI操作。
  • ViewModel中包含了LiveData,这是一种可观察数据类型结构。View经过向LIveData注册观察者,当LiveData发生改动时,就会直接调用观察者的逻辑把数据更新到view上。
  • ViewModel完全不需求关心UI操作,只需求专心于数据与事务操作。
  • Repository代表了Model层,Repository对ViewModel进行了减压,把事务操作般到了Repository中,防止了viewModel臃肿。
  • Repository对恳求进行判别是要到本地数据库获取还是网络恳求获取分别调用不同的模块。

jetpack的架构组件库是一整套完整的架构组件库,包括了:DataBinding,LiveData,ViewModel,Navigation,Lifecycle。下面咱们简略了解一下每个组件的功用: 拜访基于 activity 构建的可组合 API。 更多拜访Android developer |

组件名 功用点
DataBinding 1.解基于数据驱动思想,决视图调用共同性问题,完成双向绑定2.防止编写样板式代码,进步效率
LiveData 1.经过唯一可信源获取数据,正确分发数据2.与Lifecycle结合,拥有生命周期感知才能,配合viewModel完成效果域可控3.完成模块的单向依靠,抛弃接口回调
ViewModel 1托管界面状况,处理状况办理问题2.完成跨页面数据分享,并为数据设置效果域,做到效果域可控3.完成单向依靠,防止内存走漏
Lifecycle 1.以简洁地方式处理生命周期办理的共同性问题 2.防止内存走漏的情况下让第三方组件随时获取生命周期状况,追踪事故地点的生命周期源,对错过时机的异步操作及时停止
Navigation 1.经过遵从导航定则完成对Fragment的办理

咱们只需求遵从他的开发规范,运用他的架构结构,就能够开发出十分健壮的项目。MVVM的实质是什么?

一种基于数据驱动型,将UI逻辑和事务逻辑完全别离的架构形式。

差异

MVC是不同职责代码别离,MVP是在MVC的基础上经过接口通讯降低模块间的耦合性,MVC,MVP都是广义上的架构形式,Android仅仅他们的一个应用场景。MVVM是专心于页面开发的架构形式,更加契合页面开发形式。

mvvm+Jetpack 示例用法demo