Mvp定义

它是一种由MVC演变而来的设计模式,其中M-Model,V-View,P-Presenter.M层主要负责网络请求,数据处理,V层就是我们的视图层了(activity,fragment等),P层负责逻辑,控制着M层.使M与V层完全解耦.

Mvp的作用是什么呐?

当Mvp才出来的时候,我就去网上找了很多例子看了下,结果是一脸懵逼,太多的类与接口了,于是我就放弃了这种设计模式,然而当我在开发项目的时候发现自己的代码很乱,可读性很差,修改也很困难,于是乎我又在网上看了一些Mvp设计模式的资料,大体上都说,这种模式开发出来的项目,代码可读性强,修改起来方便,适合大型项目,团队开发.那么Mvp是不是真正有这些优势呐?这里我就模仿一个登录请求页面,请看下面的代码:

View层

1.首先我们创建一个LoginView的接口,这个接口对外开发四个方法(方法数量以及定义按实际需求写)showProgress()显示加载框的方法,dissProgress()取消加载框的方法, loginSuccess()登录成功的方法,loginFail()登录失败的方法.

  public  interface LoginView{

       void showProgress();

       void dissProgress();

       void loginSuccess();

        void loginFail();

}

2.我们再创建View层的Activity,比如名字LoginActivity去实现这个LoginView的接口

public class Loginctivity extends Activity implements LoginView{

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 

    } 

   @Override

   public void showProgress() 

    }

    @Override

   public void disssProgress() {

    }
    @Override
    public void loginSuccess() {
       
    }
    @Override
    public void loginFail() {
       
    }

}

Model层

1.同样我们先创建一个LoginModel的接口,接口里面对外提供一个login(String username,String pw)的登陆方法,另外在LoginModel内部再创建一个接口来监听login()方法是成功还是失败,如LoginListener接口,代码如下:

public interface LoginModel{

    interface LoginListener{

          void loginSuccess();

          void loginFail();

}

void login(String username,String pw,LoginListener loginlistener);

}

2.我们在1中model层的接口已经创建好了,那么现在我们就创建一个类来实现这个接口,LoginModelImp类,代码如下:

  public  class  loginModelImp implements LoginModel{

           @Override

    public void login(String username,String pw,LoginListener loginlistener) {

//可以看到这里我们需要实现loginlistener这个接口里面的两个方法loginSuccess(),loginFail()

//--假如我们这里做了一个登录请求,请求的代码就省略了我们只看登录结果

//--如果登录成功

  if(true){

     loginlistener.loginSuccess();

}

//--登录失败

else{

     loginlistener.loginFail()

}

       
    }

 

}

Presenter层

1.同样我们需要定义一个接口LoginPresenter,对外提供一个执行登录的方法doLogin()

public interface LoginPresenter{

     void  doLogin(String username,String pw);

}

2.定义一个类来实现loginpresenter接口,以及loginlistener接口

public class LoginPresenterImp implements LoginPresenter,LoginListener{

LoginView  loginview;

LoginModelImp loginModelImp;

public LoginPresenterImp(LoginView loginView, LoginModelImp loginModelImp) {
        this.loginView = loginView;
        this.loginModelImp = loginModelImp;
    }

@Override

    public void doLogin(String username, String pw) {

//--控制view层执行显示进度框方法,控制modl层去执行登录方法

         loginView.showProgress();
        loginModelImp.Login(username,pw,this);

        


    }

    @Override
    public void LoginSuccess() {
        //--再次启动请求成功后的方法,然后再view中执行
        loginView.hideProgress();
        loginView.loginSuccess();


    }
    @Override
    public void LoginFail() {
        //--再次启动请求失败后的方法,然后再view中执行
        loginView.hideProgress();
        loginView.loginFail();
    }

 

}

最后我们在LoginActivity中添加如下代码:

LoginPresenterImp  loginPresenterImp = new LoginPresenterImp(this, new LoginModelImp());

 loginPresenterImp.doLogin("10000", "123456");

总结:activity中调用登录方法,然后presenter中去控制model层登录,从而model层中loginlistener监听登录结果失败或者成功,并且将结果返回给presenter,最后presneter去控制view层执行的方法.我们从LoginPresenterImp这个类中可以看出,无论是Model层还是View层,他都是由Presenter层来控制的.