小白入门MVP第一课

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42171948/article/details/88317847

第一次写文章,有错误的地方希望各位看官不吝赐教哈~

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并没有解耦,问题感觉还是很大。

扫描二维码关注公众号,回复: 7617299 查看本文章

好在还有一种能将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实现数据存储。

先这样,代码优化等待输出~

猜你喜欢

转载自blog.csdn.net/qq_42171948/article/details/88317847