MVP安卓开发模式
- MVP是什么
MVP是安卓开发中的采用的一种设计模式,是MVC设计模式演变而来的,是由模型层(Model)-视图(View)-主持人(presenter)组成。
其中:
模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;
视图(View):负责界面数据的展示,与用户进行交互;
主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来。 - 优缺点
- 优点:
1.降低耦合度,提高维护性
2.模块职责划分明显
3.代码灵活性
4.代码复用
5.易于单元测试 - 缺点:
每个view都有presenter ,类相对比较多
- 优点:
- 原理
View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持有Viwe层以及Model层的Interface的引用,而View层持有Presenter层Interface的引用。当View层某个界面需要展示某些数据的时候,首先会调用Presenter层的某个接口,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会调用Presenter层的回调方法通知Presenter层数据加载完毕,最后Presenter层再调用View层的接口将加载后的数据展示给用户。 - 在项目中的应用
以一个登陆为例
**LoginView.java**
public interface LoginView {
/**
* 此处定义用于Activity实现的接口
* @param messageWhat 返回错误类型
*/
public void onFaile(int messageWhat);
/**
* 登陆成功时,执行这个方法
*/
public void onSuccess();
}
上面定义了一个接口,会在View层进行调用,并且会以参数的形式,传进P层(相当于一个注册<回调方法的操作>)
**Maintivity.java**
public class MainActivity extends AppCompatActivity implements LoginView{
public static final int USERNAME_ERROR = 1;
public static final int PASSWORD_ERROR = 2;
EditText mEditTextUsername;
EditText mEditTextPassword;
LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditTextUsername = (EditText) findViewById(R.id.main_et_username);
mEditTextPassword = (EditText) findViewById(R.id.main_et_password);
//传参数属于一个注册的操作
mLoginPresenter = new LoginPresenterImpl(this);
}
public void login(View view) {
String username = mEditTextUsername.getText().toString();
String password = mEditTextPassword.getText().toString();
//调用主持者的方法
mLoginPresenter.checkUser(username,password);
}
@Override
public void onFaile(int messageWhat) {
if(messageWhat == USERNAME_ERROR){
show("用户名错误");
}else if(messageWhat == PASSWORD_ERROR){
show("密码错误");
}
}
private void show(String text) {
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess() {
Intent intent = new Intent(this,SuccessActivity.class);
intent.putExtra("message","你登陆成功了");
startActivity(intent);
}
}
上面定义了一个Activity,是用来控制View的具体,也属于View层的范畴,在onCreate()方法中,通过实例化一个P层对象的时候,传过去了一个本例的对象,这个操作就是一个注册回调方法的操作.
**LoginPresenter.java**
public interface LoginPresenter {
/**
*
* @param username 用户名
* @param password 密码
*/
public void checkUser(String username, String password);
/**
* 检测用户名是否正确
* @param username
* @param loginView
*/
public void isCorrect(String username,LoginView loginView);
}
上面定义了一个P层的接口,用来给P层进行实现的
public class LoginPresenterImpl implements LoginPresenter,LoginModle.LoginModleP {
LoginView mLoginView;
LoginModle mLoginModle;
public LoginPresenterImpl(LoginView loginView) {
mLoginView = loginView;
mLoginModle = new LoginModleImpl(this);//将自身传进来
}
@Override
public void checkUser(String username, String password) {
mLoginModle.login(username,password);
}
@Override
public void isCorrect(String username, LoginView loginView) {
}
@Override
public void onSuccess() {
mLoginView.onSuccess();
}
@Override
public void onFaile(int messageWhat) {
mLoginView.onFaile(messageWhat);
}
}
上面是一个P层的实现,在构造方法中,通过接受一个View层的接口,实现了View层回调方法的注册,另,通过实例化M层一个对象的时候,传递给M层一个其接口的方式,实现了回调方法的注册。
public interface LoginModle {
/**
* 一级接口是给Modle继承用的,
* 二级接口是给P层进行继承调用的,
* 这样做是因为,一级接口有些方法在P层不会用到
*/
public interface LoginModleP{
/**
* 登陆成功
*/
public void onSuccess();
/**
* 登陆失败
* @param messageWhat 错误类型
*/
public void onFaile(int messageWhat);
}
/**
*验证登陆
* @param username 用户名
* @param password 密码
*/
public void login(String username,String password);
}
在上面是M层的接口,可以看到里面有两级接口,一级接口是给M层进行实现,里面是一些需要实现的方法,用来进行一些业务逻辑的操作,二级接口是用来给P层进行继承实现,这样M层就可以通过P层传递来的参数进行回调方法的调用。
public class LoginModleImpl implements LoginModle {
public static final int USERNAME_ERROR = 1;
public static final int PASSWORD_ERROR = 2;
LoginModleP mLoginModleP;
public LoginModleImpl(LoginModleP loginModleP) {
mLoginModleP = loginModleP;
}
@Override
public void login(String username, String password) {
boolean success = false;
if(username.equals("root")){
//登陆成功
success = true;
}else{
success = false;
mLoginModleP.onFaile(USERNAME_ERROR);
}
if(password.equals("adminelife")){
//登陆成功
success = true;
}else{
success = false;
mLoginModleP.onFaile(PASSWORD_ERROR);
}
if(success){
mLoginModleP.onSuccess();
}
}
}
上面是M层的具体实现,如果验证成功的话,会通过调用P层的回调方法,把结果传递给P层,这样P层同样通过回调方法,把结果传递给View层,最后用来显示。
最后,MVP的整个过程就结束了。