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