本文主要講解MVP開發(fā)模式以及具體實(shí)例。
一、簡介
MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一個演化版本,目前它在Android應(yīng)用開發(fā)中越來越重要了。初看起來我們會感覺增加了很多類接口代碼看起來更加清晰。
MVP模式可以分離顯示層和邏輯層,所以功能接口如何工作與功能的展示可以實(shí)現(xiàn)分離,MVP模式理想化地可以實(shí)現(xiàn)同一份邏輯代碼搭配不同的顯示界面。不過MVP不是一個結(jié)構(gòu)化的模式,它只是負(fù)責(zé)顯示層而已,任何時候都可以在自己的項目結(jié)構(gòu)中使用MVP模式。(不局限于Android項目開發(fā))
因為MVP其實(shí)就是從MVC模式演化產(chǎn)生的,那么我們先看一下著名的MVC模式:
對應(yīng)的交互圖如下:

雖然Android系統(tǒng)應(yīng)用開發(fā)本身是遵循MVC開發(fā)模式的,但是我們仔細(xì)看一下View層和Activity,具體view布局文件中的數(shù)據(jù)綁定和事件處理的方法代碼都是冗余在Activity中的,所以我們經(jīng)常看可以看到Activity類動不動就是少則九百行,多則上千甚至幾千行。那么現(xiàn)在的演化升級版本的MVP的模式又是怎么樣的呢?MVP模式會引入 Presenter層,該機(jī)型復(fù)雜完成View層和Model層的交互,那么具體MVP對應(yīng)如下:
數(shù)據(jù)交互圖如下:

觀察上面兩個模式的交互圖,是不是MVP模式更加清晰簡單啊!
二、MVC和MVP區(qū)別
我們來具體看一下下面兩張對比,就可以看來具體區(qū)別了:

觀察上圖我們可以發(fā)現(xiàn)MVP模式中,View 和Model的交互是通過Presenter來進(jìn)行完成,這樣統(tǒng)一管理,邏輯會更加清晰。
三、MVP模式例子講解
3.1.具體實(shí)現(xiàn)功能需求:我們是用MVP模式來進(jìn)行實(shí)現(xiàn)用戶登錄操作.
3.2.例子實(shí)例如下:

3.3.項目代碼框架如下:

3.4.代碼具體實(shí)現(xiàn):
3.4.1.Model層:Bean類(Entity),PersonBean類,然后在業(yè)務(wù)邏輯類中有登錄方法,同時把登錄成功狀態(tài)回調(diào)接口傳入進(jìn)入,具體如下:
package com.chinaztt.fda.entity;/*** 當(dāng)前類注釋:用戶信息實(shí)體類* 項目名: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;/*** 當(dāng)前類注釋:用戶相關(guān)業(yè)務(wù)邏輯實(shí)現(xiàn)類* 項目名: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();}//進(jìn)行開始登錄,這邊應(yīng)該進(jìn)行請求服務(wù)器,進(jìn)行數(shù)據(jù)驗證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;/*** 當(dāng)前類注釋:登錄請求結(jié)果回調(diào)* 項目名:FastDev4Android* 包名:com.chinaztt.fda.biz*/public interface LoginRequestCallBack {//登錄成功回調(diào)方法void loginSuccess(PersonBean personBean);//登錄失敗回調(diào)方法void loginFailed();}3.4.2.View層:該通過Presenter與View進(jìn)行交互,這邊需要定義一個接口ILoginView:
package com.chinaztt.fda.ui.view;import com.chinaztt.fda.entity.PersonBean;/*** 當(dāng)前類注釋:登錄頁面 相關(guān)操作 功能接口* 項目名:FastDev4Android* 包名:com.chinaztt.fda.ui.view*/public interface ILoginView {//獲取用戶名String getUserName();//獲取密碼String getPassword();void showSuccessInfo(PersonBean personBean);void showFailedInfo();}有了上面的接口之后,我們就需要寫我們的實(shí)現(xiàn)類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;/*** 當(dāng)前類注釋:MVP開發(fā)模式實(shí)例* 項目名: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();}});}/*** 進(jìn)行返回用戶名信息* @return*/@Overridepublic String getUserName() {return ed_username.getText().toString().trim();}/*** 進(jìn)行返回用戶密碼信息* @return*/@Overridepublic String getPassword() {return ed_password.getText().toString().trim();}/*** 登錄成功 回調(diào)* @param personBean*/@Overridepublic void showSuccessInfo(PersonBean personBean) {Log.d(TAG,"showSuccessInfo:"+personBean.toString());showToastMsgShort("登錄成功:"+personBean.toString());}/*** 登錄失敗 回調(diào)*/@Overridepublic void showFailedInfo() {Log.d(TAG,"showFailedInfo...");showToastMsgShort("登錄失敗...");}}最后還少一個交互橋梁Presenter:
3.4.3.Presenter層:作為Model和View之間的交互橋梁,在本例中進(jìn)行執(zhí)行登錄操作,然后去Model業(yè)務(wù)中執(zhí)行登錄,最后把登錄結(jié)果信息返回給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;/*** 當(dāng)前類注釋:負(fù)責(zé)完成登錄界面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了。
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選