首页 > 系统 > Android > 正文

详解Android MVP开发模式

2020-04-11 10:58:02
字体:
来源:转载
供稿:网友

本文主要讲解MVP开发模式以及具体实例。

一、简介

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模式例子讲解

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

3.2.例子实例如下:

3.3.项目代码框架如下:

3.4.代码具体实现:

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

package com.chinaztt.fda.entity;/*** 当前类注释:用户信息实体类* 项目名:FastDev4Android* 包名:com.chinaztt.fda.entity*/public class PersonBean {private String username;private String password;public PersonBean() {}public PersonBean(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "PersonBean{" +"username='" + username + '/'' +", password='" + password + '/'' +'}';}}
public interface IPersonBiz {void login(String username,String password,LoginRequestCallBack valueCallBack);
package com.chinaztt.fda.biz.imp;import com.chinaztt.fda.biz.IPersonBiz;import com.chinaztt.fda.biz.LoginRequestCallBack;import com.chinaztt.fda.entity.PersonBean;import com.chinaztt.fda.utils.Log;/*** 当前类注释:用户相关业务逻辑实现类* 项目名:FastDev4Android* 包名:com.chinaztt.fda.biz.imp*/public class PersonBizImp implements IPersonBiz{private static final String TAG="PersonBizImp";@Overridepublic void login(final String username, final String password, final LoginRequestCallBack valueCallBack) {Log.d(TAG,"username:"+username+",password:"+password);new Thread(new Runnable() {@Overridepublic void 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();}}
package com.chinaztt.fda.biz;import com.chinaztt.fda.entity.PersonBean;/*** 当前类注释:登录请求结果回调* 项目名:FastDev4Android* 包名:com.chinaztt.fda.biz*/public interface LoginRequestCallBack {//登录成功回调方法void loginSuccess(PersonBean personBean);//登录失败回调方法void loginFailed();}

3.4.2.View层:该通过Presenter与View进行交互,这边需要定义一个接口ILoginView:

package com.chinaztt.fda.ui.view;import com.chinaztt.fda.entity.PersonBean;/*** 当前类注释:登录页面 相关操作 功能接口* 项目名:FastDev4Android* 包名:com.chinaztt.fda.ui.view*/public interface ILoginView {//获取用户名String getUserName();//获取密码String getPassword();void showSuccessInfo(PersonBean personBean);void showFailedInfo();}

有了上面的接口之后,我们就需要写我们的实现类Activity了,就非常简单了

package com.chinaztt.fda.test;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import com.chinaztt.fda.entity.PersonBean;import com.chinaztt.fda.presenter.LoginPresenter;import com.chinaztt.fda.ui.R;import com.chinaztt.fda.ui.base.BaseActivity;import com.chinaztt.fda.ui.view.ILoginView;import com.chinaztt.fda.utils.Log;import org.androidannotations.annotations.EActivity;/*** 当前类注释:MVP开发模式实例* 项目名:FastDev4Android* 包名:com.chinaztt.fda.test*/@EActivitypublic class MVPTestActivity extends BaseActivity implements ILoginView{private static final String TAG="MVPTestActivity";private EditText ed_username;private EditText ed_password;private Button btn_login;private LoginPresenter mLoginPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mvp_test_layout);ed_username=(EditText)this.findViewById(R.id.ed_username);ed_password=(EditText)this.findViewById(R.id.ed_password);btn_login=(Button)this.findViewById(R.id.btn_login);mLoginPresenter=new LoginPresenter(this);btn_login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mLoginPresenter.loginSystem();}});}/*** 进行返回用户名信息* @return*/@Overridepublic String getUserName() {return ed_username.getText().toString().trim();}/*** 进行返回用户密码信息* @return*/@Overridepublic String getPassword() {return ed_password.getText().toString().trim();}/*** 登录成功 回调* @param personBean*/@Overridepublic void showSuccessInfo(PersonBean personBean) {Log.d(TAG,"showSuccessInfo:"+personBean.toString());showToastMsgShort("登录成功:"+personBean.toString());}/*** 登录失败 回调*/@Overridepublic void showFailedInfo() {Log.d(TAG,"showFailedInfo...");showToastMsgShort("登录失败...");}}

最后还少一个交互桥梁Presenter:
3.4.3.Presenter层:作为Model和View之间的交互桥梁,在本例中进行执行登录操作,然后去Model业务中执行登录,最后把登录结果信息返回给View层,就是这么简单:

package com.chinaztt.fda.presenter;import android.os.Handler;import com.chinaztt.fda.biz.IPersonBiz;import com.chinaztt.fda.biz.LoginRequestCallBack;import com.chinaztt.fda.biz.imp.PersonBizImp;import com.chinaztt.fda.entity.PersonBean;import com.chinaztt.fda.ui.view.ILoginView;import com.chinaztt.fda.utils.Log;/*** 当前类注释:负责完成登录界面View于Model(IPersonBiz)间的交互* 项目名:FastDev4Android* 包名:com.chinaztt.fda.presenter*/public class LoginPresenter {private static final String TAG="LoginPresenter";private ILoginView mLoginView;private IPersonBiz mPersonBiz;private Handler mHandler=new Handler();public LoginPresenter(ILoginView view) {mLoginView = view;mPersonBiz = new PersonBizImp();}public void loginSystem(){mPersonBiz.login(mLoginView.getUserName(), mLoginView.getPassword(), new LoginRequestCallBack() {/*** 登录成功* @param personBean*/@Overridepublic void loginSuccess(final PersonBean personBean) {Log.d(TAG, "登录成功:" + personBean.toString());mHandler.post(new Runnable() {@Overridepublic void run() {mLoginView.showSuccessInfo(personBean);}});}/*** 登录失败*/@Overridepublic void loginFailed() {Log.d(TAG,"登录失败...");mHandler.post(new Runnable() {@Overridepublic void run() {mLoginView.showFailedInfo();;}});}});}}

到此我们的MVP模式的例子就大体完成了,看一下上面的效果演示就OK了。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表