android 关于MVC,MVP,MVVM的总结和思考

首先,我们先大致了解Android开发中常见的模式,以便我们更深入了解MVVM 模式。


MVC

View对应于xml布局文件

Model实体模型

Controllor对应于Activity业务逻辑,数据处理和UI处理


从上面看起来各个组件的职责视乎还挺耦合MVC的,但是打开Android的一个Activity文件,一看一言难尽, Android中经常会出现数千行的Activity代码,究其原因,Android中纯粹作为View的各个XML视图功能太弱,Activity基本上都是ViewController的合体,既要负责视图的显示又要加入控制逻辑,承担的功能过多,代码量大也就不足为奇。所有更贴切的目前常规的开发说应该是View-Model 模式,大部分都是通过Activity的协调,连接,和处理逻辑的。


MVP

View: 对应于Activityxml,负责View的绘制以及与用户交互

Model: 依然是实体模型

Presenter: 负责完成ViewModel间的交互和业务逻辑


Android开发中MVP的设计思想用得比较多,利用MVP的设计模型可以把部分的逻辑的代码从FragmentActivity业务的逻辑移出来,在Presenter中持有ViewActivity或者Fragment)的引用,然后在Presenter调用View暴露的接口对视图进行操作,这样有利于把视图操作和业务逻辑分开来。MVP能够让Activity成为真正的View而不是ViewControl的合体,Activity只做UI相关的事。但是这个模式还是存在一些不好的地方,比较如说:

Activity需要实现各种跟UI相关的接口,同时要在Activity中编写大量的事件,然后在事件处理中调用presenter的业务处理方法,ViewPresenter只是互相持有引用并互相做回调,代码不美观。

这种模式中,程序的主角是UI,通过UI事件的触发对数据进行处理,更新UI就有考虑线程的问题。而且UI改变后牵扯的逻辑耦合度太高,一旦控件更改(比较TextView 替换 EditText等)牵扯的更新UI的接口就必须得换。

复杂的业务同时会导致presenter层太大,代码臃肿的问题。


MVVM

View: 对应于Activityxml,负责View的绘制以及与用户交互

Model: 实体模型

ViewModel: 负责完成ViewModel间的交互,负责业务逻辑


MVVM的目标和思想MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。


数据驱动

MVVM中,以前开发模式中必须先处理业务数据,然后根据的数据变化,去获取UI的引用然后更新UI,通过也是通过UI来获取用户输入,而在MVVM中,数据和业务逻辑处于一个独立的View Model中,ViewModel只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动UI去自动更新UIUI的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。

低耦合度

MVVM模式中,数据是独立于UI的,ViewModel只负责处理和提供数据,UI想怎么处理数据都由UI自己决定,ViewModel 不涉及任何和UI相关的事也不持有UI控件的引用,即使控件改变(TextView 换成 EditTextViewModel 几乎不需要更改任何代码,专注自己的数据处理就可以了,如果是MVP遇到UI更改,就可能需要改变获取UI的方式,改变更新UI的接口,改变从UI上获取输入的代码,可能还需要更改访问UI对象的属性代码等等。

更新 UI

MVVM中,我们可以在工作线程中直接修改View Model的数据(只要数据是线程安全的),剩下的数据绑定框架帮你搞定,很多事情都不需要你去关心。

团队协作

MVVM的分工是非常明显的,由于ViewView Model之间是松散耦合的。一个是处理业务和数据,一个是专门的UI处理。完全有两个人分工来做,一个做UIxml Activity)一个写ViewModel,效率更高。

可复用性

一个View Model复用到多个View中,同样的一份数据,用不同的UI去做展示,对于版本迭代频繁的UI改动,只要更换View层就行,对于如果想在UI上的做AbTest 更是方便的多。

单元测试

View Model里面是数据和业务逻辑,View中关注的是UI,这样的做测试是很方便的,完全没有彼此的依赖,不管是UI的单元测试还是业务逻辑的单元测试,都是低耦合的。

猜你喜欢

转载自blog.csdn.net/u012760848/article/details/80525848
今日推荐