第一次写文章,有错误的地方希望各位看官不吝赐教哈~
1.从堆砌代码到MVC
想一想,实现登录注册功能的时候,你是怎么做的?我的话比如说实现一个登陆注册的功能,我会很自然地将控件绑定,点击事件的逻辑处理,发送网络请求以及回调处理等都放在activity或fragment中,这样子就完成了最基本的登录注册功能。
然而我们考虑一下,如果工程规模大了不止一倍呢?如果一个项目需要很多activity和fragment呢?如此看来,这种将各种代码逻辑堆砌在一个或几个activity中的做法显然不利于理清逻辑和单元测试。
这个时候设计模式就发挥出了它的作用啦,
先来说说MVC,MVC是我最早接触的一款设计模式,也曾经流行了很久。
Model层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。
View层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。
Conteoller层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。model层和controller层通过接口连接。
这样子分的话,逻辑就清晰很多了!
2.从MVC到MVP
确实,使用了MVC比堆砌代码舒服多了,但是还是有些许问题。比如依据上面所说的我们可以很清楚地看出,activity或fregment还是承担了很多任务,V层和C层连接过于紧密。model彻底解耦,但controller和view并没有解耦,问题感觉还是很大。
好在还有一种能将MVC三层更加解耦的设计模式,那就是MVP。MVP的话model还是拿数据和处理数据,但activity和presenter就很不一样了。
使用了MVP,我们就能让activity专注于界面显示和获取用户输入数据,而逻辑处理的重任就交给了我们的中介人,presenter。那如何实现三个部分的交互呢,对于一些需要经常使用到的公共的方法,我们可以定义接口,让需要用到这些方法的activity去继承。这样子三层间就实现了完全解耦。
3.MVC和MVP的区别及优缺点
-
3.1 区别
- 1 MVC的三层解耦不彻底,MVP三层解耦彻底。
- 2 MVP代码量多于MVC。
- 3 三层相互访问的不同,MVC可以直接相互反馈,MVP只能V->P->M,Model层不能直接和View层交流。
-
3.2 MVC的优缺点
-
3.2.1 优点
将项目分成了三层,使逻辑更为明晰。
- 3.2.2 缺点
controller和view之间并没有解耦,activity和fragment仍然承担了很多任务。
-
3.3 MVP的优缺点
-
3.3.1 优点
(1) 使用controller将activity从繁重的劳务中解脱出来,使其专注于接受界面数据,响应用户操作,controller专注于数据交换和逻辑处理,model专注于提供数据。
(2) 逻辑清晰,三层分工明确,完全解耦,便于测试。 -
3.3.2 缺点
(1) 代码量较大。
4.MVPdemo
实践出真知,学习了MVP后,立马做一个小demo来体验体验是最好的,第一次写还是出了一些小问题,不过磕磕碰碰还是完成啦!现在来记录一下
首先,明确一下功能,很简单就是实现一个登录功能,数据存在shareprefrence里面。
demo目录结构如下,
V层由ShowView承担,继承了IView接口,实现了必要的showLoading().hideLoading(),showMessage(),onLoginSuccess(),onLoginFail()抽象方法。
P层由LoginPresenter承担,实现了IModel接口,使用初始化后的IView对象实现对界面的控制。
M层由ModelData承担,获取和处理数据,包含在方法里面供P层调用。
由于数据量小,所以使用shareprefrence实现数据存储。
先这样,代码优化等待输出~