天天看點

android mvp模式作用,詳解Android MVP開發模式

本文主要講解MVP開發模式以及具體執行個體。

一、簡介

MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一個演化版本,目前它在Android應用開發中越來越重要了。初看起來我們會感覺增加了很多類接口代碼看起來更加清晰。

MVP模式可以分離顯示層和邏輯層,是以功能接口如何工作與功能的展示可以實作分離,MVP模式理想化地可以實作同一份邏輯代碼搭配不同的顯示界面。不過MVP不是一個結構化的模式,它隻是負責顯示層而已,任何時候都可以在自己的項目結構中使用MVP模式。(不局限于Android項目開發)

因為MVP其實就是從MVC模式演化産生的,那麼我們先看一下著名的MVC模式:

View:對應于布局檔案

Model:業務邏輯和實體模型

Controller:控制器,Android中對應于Activity

對應的互動圖如下:

android mvp模式作用,詳解Android MVP開發模式

雖然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層的互動操作。

資料互動圖如下:

android mvp模式作用,詳解Android MVP開發模式

觀察上面兩個模式的互動圖,是不是MVP模式更加清晰簡單啊!

二、MVC和MVP差別

我們來具體看一下下面兩張對比,就可以看來具體差別了:

android mvp模式作用,詳解Android MVP開發模式

觀察上圖我們可以發現MVP模式中,View 和Model的互動是通過Presenter來進行完成,這樣統一管理,邏輯會更加清晰。

三、MVP模式例子講解

3.1.具體實作功能需求:我們是用MVP模式來進行實作使用者登入操作.

3.2.例子執行個體如下:

android mvp模式作用,詳解Android MVP開發模式

3.3.項目代碼架構如下:

android mvp模式作用,詳解Android MVP開發模式

3.4.代碼具體實作:

3.4.1.Model層:Bean類(Entity),PersonBean類,然後在業務邏輯類中有登入方法,同時把登入成功狀态回調接口傳入進入,具體如下:

package 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;

}

@Override

public 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;

public class PersonBizImp implements IPersonBiz{

private static final String TAG="PersonBizImp";

@Override

public void login(final String username, final String password, final LoginRequestCallBack valueCallBack) {

Log.d(TAG,"username:"+username+",password:"+password);

new Thread(new Runnable() {

@Override

public 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;

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;

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;

@EActivity

public 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;

@Override

protected 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() {

@Override

public void onClick(View v) {

mLoginPresenter.loginSystem();

}

});

}

@Override

public String getUserName() {

return ed_username.getText().toString().trim();

}

@Override

public String getPassword() {

return ed_password.getText().toString().trim();

}

@Override

public void showSuccessInfo(PersonBean personBean) {

Log.d(TAG,"showSuccessInfo:"+personBean.toString());

showToastMsgShort("登入成功:"+personBean.toString());

}

@Override

public 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;

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() {

@Override

public void loginSuccess(final PersonBean personBean) {

Log.d(TAG, "登入成功:" + personBean.toString());

mHandler.post(new Runnable() {

@Override

public void run() {

mLoginView.showSuccessInfo(personBean);

}

});

}

@Override

public void loginFailed() {

Log.d(TAG,"登入失敗...");

mHandler.post(new Runnable() {

@Override

public void run() {

mLoginView.showFailedInfo();;

}

});

}

});

}

}

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

以上就是本文的全部内容,希望對大家學習Android軟體程式設計有所幫助。