天天看点

mvp初探

mvp是model,view,presenter这三者,其中model是实体逻辑处理层,view是视图层,而presenter是持有层。前两者大家比较熟悉了,presenter是持有层,在presenter层中持有model,view层来实现功能。简单来说presenter就是拿model的方法,view的参数完成两者之间的交互。还有一点就是Presenter与View之间的交互是通过接口的

mvp图:

mvp初探

以登陆注册功能为例子

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