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层来控制的.