Android MVP开发模式详解

 

(一).前言:

今天我们的项目继续更新,今天我们主要讲解MVP开发模式以及具体实例。

FastDev4Android框架项目地址:https://github.com/jiangqqlmj/FastDev4Android

(二).简介:

MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了。初看起来我们会感觉增加了很多类接口代码看起来更加清晰。

MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面。不过MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式。(不局限于Android项目开发)

因为MVP其实就是从MVC模式演化产生的,那么我们先看一下著名的MVC模式:

  •       View:对应于布局文件

  •       Model:业务逻辑和实体模型

  •      Controller:控制器,Android中对应于Activity

对应的交互图如下:

虽然Android系统应用开发本身是遵循MVC开发模式的,但是我们仔细看一下View层和Activity,具体view布局文件中的数据绑定和事件处理的方法代码都是冗余在Activity中的,所以我们经常看可以看到Activity类动不动就是少则九百行,多则上千甚至几千行。那么现在的演化升级版本的MVP的模式又是怎么样的呢?MVP模式会引入  Presenter层,该机型复杂完成View层和Model层的交互,那么具体MVP对应如下:

  •       View:View通常来说是由Activity实现的,它会包含一个Presenter的引用,View要做的就只是在每次有接口调用的时候(比如按钮点击后)调用Presenter的方法。

  •        Model:业务逻辑和实体模型

  •       Presenter:主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,但是不像MVC结构,因为它也可以决定与View层的交互操作。

数据交互图如下:

观察上面两个模式的交互图,是不是MVP模式更加清晰简单啊!

(三).MVC和MVP区别:

我们来具体看一下下面两张对比,就可以看来具体区别了:

观察上图我们可以发现MVP模式中,View 和Model的交互是通过Presenter来进行完成,这样统一管理,逻辑会更加清晰。

(四).MVP模式例子讲解:

4.1.具体实现功能需求:我们是用MVP模式来进行实现用户登录操作.

4.2.例子实例如下:

4.3.项目代码框架如下:

4.4.代码具体实现:

4.4.1.Model层:Bean类(Entity),PersonBean类,然后在业务逻辑类中有登录方法,同时把登录成功状态回调接口传入进入,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
packagecom.chinaztt.fda.entity;
/**
* 当前类注释:用户信息实体类
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.entity
* 作者:江清清 on 15/10/27 14:13
* 邮箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江苏中天科技软件技术有限公司
*/

publicclass PersonBean {
privateString username;
privateString password;
public PersonBean(){
}

public PersonBean(String username, String password){
this.username= username;
this.password= password;
}

publicString getUsername(){
return username;
}

publicvoid setUsername(String username){
this.username= username;
}
publicString getPassword(){
return password;
}
publicvoid setPassword(String password){
this.password= password;
}

@Override
publicString toString(){
return"PersonBean{"+
"username='"+ username +'\''+
", password='"+ password +'\''+

'}';
}
}
1
2
3
publicinterface IPersonBiz {
void login(String username,String password,LoginRequestCallBack valueCallBack);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
packagecom.chinaztt.fda.biz.imp;
importcom.chinaztt.fda.biz.IPersonBiz;
importcom.chinaztt.fda.biz.LoginRequestCallBack;
importcom.chinaztt.fda.entity.PersonBean;
importcom.chinaztt.fda.utils.Log;
/**
* 当前类注释:用户相关业务逻辑实现类
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.biz.imp
* 作者:江清清 on 15/10/27 16:33
* 邮箱:jiangqqlmj@163.com
* QQ: 781931404
* 公司:江苏中天科技软件技术有限公司
*/

publicclass PersonBizImp implements IPersonBiz{
privatestaticfinalString TAG="PersonBizImp";
@Override
publicvoid login(finalString username, finalString password, final LoginRequestCallBack valueCallBack){
Log.d(TAG,"username:"+username+",password:"+password);
newThread(newRunnable(){
@Override
publicvoid run(){
try{
Thread.sleep(4500);
}catch(InterruptedException e){
e.printStackTrace();
}
//进行开始登录,这边应该进行请求服务器,进行数据验证
if(username.equals("jiangqq")&&password.equals("12345")){
valueCallBack.loginSuccess(new PersonBean(username,password));
}else{
valueCallBack.loginFailed();
}
}
}).start();
}
}
1
2
3
4
5
6
7
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信


和一个专注代码17年的团队,一起学习,踏实的成长,朴素、真挚的面对世界

万码学堂课程咨询电话0532-85025005

鲁ICP备09077726号-5