为什么要使用框架
设计框架的目的:
- 提高开发效率,尤其是协同工作
- 业务逻辑的切分,渐进式开发,提高业务的重用性,灵活性
- 测试以及问题的定位
- 日常的更新与维护
MVC
经典的框架,view层,model层,Controller层.
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
在android中的实践呢?
- M层:适合的业务逻辑。数据库存取,网络操作,复杂算法,耗时操作
- V层:显示数据
- Contro层:在很多情况下activity会掺和很多Controller的事情,activity负责人机交互界面。
举例:
Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。
优点:
(1)耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。便于进行单元开发,单元测试
(2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。
(3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。
缺点:
Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,当activity类业务过多的时候,会变得难以管理和维护。
尤其是当ui的状态数据,跟持久化的数据混杂在一起,变得极为混乱。
MVP
为了解决view层代码过多,引入了这套设计框架。
MVP从更早的MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
如下图
MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):
- View:负责呈现ui,与用户进行交互,如activity fragment
- Model: 负责存储,检索,操作数据
- Presenter:作为view跟model的桥梁,处理交互与数据逻辑。
- View Interface:Presenter中持有的view层接口,负责给view返回消息。降低耦合,方便单元测试
优点
1 模型与视图完全分离,我们可以修改视图而不影响模型;
2 可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;
3 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;
4 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。
两者的区别
(最主要区别)View与Model并不直接交互,而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。而Controller是基于行为的,并且可以被多个View共享,Controller可以负责决定显示哪个View
Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。
附赠MVVM知识
MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。
MVC -> MVP -> MVVM 这几个软件设计模式是一步步演化发展的,MVVM 是从 MVP 的进一步发展与规范,MVP 隔离了MVC中的 M 与 V 的直接联系后,靠 Presenter 来中转,所以使用 MVP 时 P 是直接调用 View 的接口来实现对视图的操作的,这个 View 接口的东西一般来说是 showData、showLoading等等。M 与 V已经隔离了,方便测试了,但代码还不够优雅简洁,所以 MVVM 就弥补了这些缺陷。在 MVVM 中就出现的 Data Binding 这个概念,意思就是 View 接口的 showData 这些实现方法可以不写了,通过 Binding 来实现。
google官方已经推出了Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件
Data Binding库不仅灵活而且广泛兼容- 它是一个support库,因此你可以在所有的Android平台最低能到Android 2.1(API等级7+)上使用它。
三者的异同
异
三者的差异在于如何粘合View和Model,实现用户的交互操作以及变更通知