mvp是model,view,presenter這三者,其中model是實體邏輯處理層,view是視圖層,而presenter是持有層。前兩者大家比較熟悉了,presenter是持有層,在presenter層中持有model,view層來實作功能。簡單來說presenter就是拿model的方法,view的參數完成兩者之間的互動。還有一點就是Presenter與View之間的互動是通過接口的
mvp圖:
以登陸注冊功能為例子
model
明顯要個user的實體類,這裡使用了bmob的背景,BmobUser已經為我們實作了一些基本的set,get方法。
public class UserBean extends BmobUser {
}
model處理的邏輯業務
接口類,為了後面的參數傳遞,在方法裡面放了一個參數接口
public interface ILoginRegister {
public void login(String user_name, String password, Context context,IOnloginListener onloginListener);
}
實作類,login方法裡處理登入的邏輯
public class LoginRegister implements ILoginRegister {
//登陸邏輯
@Override
public void login(String user_name, final String password, final Context context, final IOnloginListener onloginListener) {
}
view層
接口類,view就是與使用者的層。要想有什麼方法。
擷取手機号碼,擷取密碼,登入成功,登陸失敗,找回密碼,注冊
public interface ILoginView {
String getUserName();
String getPassword();
void showLoading();
void hideLoading();
void loginSuccess();
void loginFailed(String msg);
void register();
void findPassword();
}
實作類,view層的實作類就是activity類
package com.example.administrator.demo;
public class LoginActivity extends AppCompatActivity implements ILoginView {
private EditText mEtUserName,mEtPassword;
private Button mBtLogin,mBtRegister,mBtFindPassword;
private ProgressBar mPbLoading;
private LoginPresenter loginPresenter=new LoginPresenter(this);//執行個體化持有對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
void initView(){
getSupportActionBar().setTitle("登入");
mEtUserName=(EditText)findViewById(R.id.et_user_name);
mEtPassword=(EditText)findViewById(R.id.et_password);
mBtLogin=(Button)findViewById(R.id.bt_login);
mBtRegister=(Button)findViewById(R.id.bt_register);
mBtFindPassword=(Button)findViewById(R.id.bt_findPassword);
mPbLoading=(ProgressBar)findViewById(R.id.pb_login);
mBtLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginPresenter.login(LoginActivity.this);//持有層
}
});
mBtRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
register();
}
});
mBtFindPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findPassword();
}
});
}
@Override
public String getUserName() {
return mEtUserName.getText().toString();
}
@Override
public String getPassword() {
return mEtPassword.getText().toString();
}
@Override
public void showLoading() {
mPbLoading.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
mPbLoading.setVisibility(View.GONE);
}
@Override
public void loginSuccess() {
Intent intent=new Intent(this,WelcomActivity.class);
startActivity(intent);
finish();
}
@Override
public void loginFailed(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
@Override
public void register() {
startActivity(new Intent(this,RegisterActivity.class));
}
@Override
public void findPassword() {
startActivity(new Intent(this,FindPasswordActivity.class));
}
}
持有層,持有層就是持有model,view層的對象來交換
public class LoginPresenter {
private ILoginRegister loginRegister;
private ILoginView loginRegisterView;
public LoginPresenter(ILoginView loginRegisterView){
this.loginRegisterView=loginRegisterView;
this.loginRegister=new LoginRegister();
}
public void login(Context context){
loginRegisterView.showLoading();
loginRegister.login(loginRegisterView.getUserName(), loginRegisterView.getPassword(),context, new IOnloginListener() {
@Override
public void loginSuccess(UserBean userBean) {
loginRegisterView.hideLoading();
loginRegisterView.loginSuccess();
}
@Override
public void loginFailed(String msg) {
loginRegisterView.hideLoading();
loginRegisterView.loginFailed(msg);
}
});
}
感想:
1.剛開始很不适應這種模式,出現了大量的接口。
2.感覺model層加重了很多,覺得在實際中要分情況來,就是全部功能不一定要安裝mvp這種模式,應該可以混合。
3.最後感謝鴻洋的部落格http://blog.csdn.net/lmj623565791/article/details/46596109