Android项目重构MVP模式
MVP,全称Model-View-Presenter,其中Presenter解耦了Model和View,View只负责Ui视图操作,Model用来处理去数据,而Presenter用来管理Model和View的业务逻辑。
与传统MVC模式相比,方便单元测试,容易维护,排除错误等。当然缺点还算有的,个人感觉让类目增加了,代码量多了,建议呢,不是太复杂情况建议直接写就好了,舍弃Model,和presenter,以免感觉设计过多。
现在开始正文了
首先定义Model,Presenter,View各层接口
View
public interface IView {
}
Model
public interface IModel {
}
Presenter
public interface IPresenter<T extends IView> {
void attachView(T view);
void detachView();
}
当然还需要一个Model处理完数据后传递给Presenter回调
public interface ICallBack {
}
实现Ipresenter基本逻辑
BaseIPresenter,使用时直接继承该类
public abstract class BasePresenter<T extends IView, M extends IModel> implements IPresenter<T> {
protected T mView;
protected M mModel;
@Override
public void attachView(T view) {
mView = view;
}
@Override
public void detachView() {
mView = null;
}
public boolean isViewAttached() {
return mView != null;
}
public T getView() {
return mView;
}
public M getModel() {
return mModel;
}
}
写到这里MVP的基本重用模块就写好了
如何使用呢?小伙伴不要着急,我现在写个实例:
模块:登录
当然为了管理接口我们先定义一个登录管理类LoginContract
public class LoginContract {
interface View extends IView {
void onSucceedLogin(String msg);
void onFailureLogin(String error);
}
interface Model extends IModel {
void login(String userName, String passdWord, LoginContract.CallBack callBack);
}
interface Presenter extends IPresenter<View> {
void login(String userName, String passdWor);
}
interface CallBack extends ICallBack {
void onSucceedLogin(String msg);
void onFailureLogin(String error);
}
}
LoginPresenter
public class LoginPresenter extends BasePresenter<LoginContract.View, LoginContract.Model> implements LoginContract.Presenter {
@Override
public void attachView(LoginContract.View view) {
super.attachView(view);
mModel = new LoginModel() ;
}
public void login(String userName, String passdWord) {
mModel.login(userName, passdWord, new LoginContract.CallBack() {
@Override
public void onSucceedLogin(String msg) {
mView.onSucceedLogin(msg);
}
@Override
public void onFailureLogin(String error) {
mView.onFailureLogin(error);
}
});
}
}
LoginModel
public class LoginModel implements LoginContract.Model{
public void login(String userName, String passdWord, LoginContract.CallBack callBack){
if(userName.equals("1")&&passdWord.equals("1")){
callBack.onSucceedLogin("登录成功");
}else {
callBack.onFailureLogin("登录失败");
}
}
}
LoginActivity
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
protected LoginPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPresenter = new LoginPresenter();
mPresenter.attachView(this);
initEventAndData();
}
private void initEventAndData() {
mPresenter.login("1", "1");
}
@Override
protected void onDestroy() {
if (mPresenter != null) {
mPresenter.detachView();
}
super.onDestroy();
}
@Override
public void onSucceedLogin(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void onFailureLogin(String error) {
Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}
}
[源码地址]: https://github.com/kekegdsz/MVP_ForLogin ‘mvp’