MVP安卓开发模式

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的整个过程就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值