MVC
-
Model(模型层)
数据保存,针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。
-
View
用户界面,对应于xml布局文件和java代码动态view部分
-
Controller(控制层)
业务逻辑。Controller接收View的操作事件,根据事件不同,或者调用Model的接口进行数据操作,或者进行View的跳转,从而也意味着一个Controller可以对应多个View。Controller对View的实现不太关心,只会被动地接收,Model的数据变更不通过Controller直接通知View,通常View采用观察者模式监听Model的变化。
MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。
View层通过Controller来进行指令的传达,通知Model进行数据的变化,而Model的变化有需要进行UI界面的修改,可以通过Controller进行更新。
由于android中有个god object的存在activity,再加上android中xml布局的功能性太弱,所以activity承担了绝大部分的工作。所以在android中mvc更像是这种形式:
MVC总结
- 具有一定的分层,model彻底解耦,controller和view并没有解耦
- 层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有
- controller和view在android中无法做到彻底分离,但在代码逻辑层面一定要分清
- 业务逻辑被放置在model层,能够更好的复用和修改增加业务.
MVP
在Android开发过程中,Activity和Fragment占据了大量的代码,虽然进行了模块的划分和接口隔离,但是也出现了很多的代码。1000+分分钟想砸电脑有木有啊😤其实也不能全怪activity啊哈哈哈,毕竟又要负责UI又要负责交互的说,一些业务逻辑也在里面所以变得臃肿。那么,就出现了MVP,将View和Controller进行分离.
Model
-
View
Activity响应生命周期,其他工作转移至Presenter完成
-
Presenter
Model和View之间的桥梁。Presenter与Controller一样,接收View的命令,对Model进行操作;与Controller不同的是Presenter会反作用于View,Model的变更通知首先被Presenter获得,然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View对逻辑代码分担的程度不同,这种模式又有两种情况:Passive View和Supervisor Controller。
MVP好处
- 代码变少
- 可读性提高
- 耦合性降低
- 避免内存泄露
- 方便进行单元测试
MVP缺点
由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
MVVM
MVVM中跟MVP中一样,将三层划分的很清楚。
Activity和xml layout充当View,
ViewModel处理业务逻辑以及获取数据,弱化Model。
ViewModel
注意这里的“Model”指的是View的Model,跟MVVM中的一个Model不是一回事。所谓View的Model就是包含View的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。
MVVM与MVP区别
- 在MVP中View和presenter要相互持有,方便调用对方
- 在MVVM中 View和ViewModel通过Binding进行关联,他们之前的关联处理通过DataBinding完成
MVVM与DataBinding的关系
MVVM是一种思想,DataBinding是谷歌推出的方便实现MVVM的工具。
在google推出DataBinding之前,因为xml layout功能较弱,想实现MVVM非常困难。而DataBinding的出现可以让我们很方便的实现MVVM。
MVVM Sample
DataBinding指路
MVVM总结
看起来MVVM很好的解决了MVC和MVP的不足,但是由于数据和视图的双向绑定,导致出现问题时不太好定位来源,有可能数据问题导致,也有可能业务逻辑中对视图属性的修改导致。如果项目中打算用MVVM的话可以考虑使用官方的架构组件ViewModel、LiveData、DataBinding去实现MVVM