MVP模式
引言
由于在android中,MVC模式中的C承担了C和V的作用,导致C中的代码十分混乱,难以阅读。现在MVP模式目前在android应用程序中被广泛使用,主要由于:
MVP优势
- MVP模式将视图和业务逻辑相分离,减轻了C的负担,降低了耦合。
- 视图和业务逻辑的代码被分别抽取到Model和Presenter中,曾经的C层变得简洁,提高了代码的可阅读性。
- 业务代码被抽取到Presenter中,方便了单元测试。
- 业务代码被抽取到Presenter中,避免了后台线程引用Activity或fragment,造成内存泄漏。
MVP的UML图
代码实现
为了调试方便,并未在android程序中书写,但whatever,重要的是思想。
在阅读代码之前,首先明确一下,MVP中的M、V、P的职责分别是什么。
- M即Model层,它负责定义获取数据的操作接口。
- V即View层,它负责界面中显示数据的操作。
- P即Presenter层,它负责调用Model层中定义的方法并进行实现。
下面是代码的结构图:
//model层接口,实现该接口的类负责实际的数据获取操作
public interface IModel {
void getData(Model.LoadDataCallback callback);
}
复制代码
//实现IModel的接口,负责数据的获取操作
public class Model implements IModel {
@Override
public void getData(LoadDataCallback callback) {
//模拟耗时操作
new Thread(() -> {
try {
Thread.sleep(3000);
callback.success("3秒过去了,请求成功");
} catch (Exception e) {
e.printStackTrace();
callback.fail("失败");
}
}).start();
}
public interface LoadDataCallback {
void success(String msg);
void fail(String msg);
}
}
复制代码
//Presenter层的接口,控制Model层的数据操作及调用View层的UI操作来完成“中间人”工作
public interface IPresenter {
void loadData(String msg);
}
复制代码
//用于model和view的相关方法的调用
public class Presenter implements IPresenter, Model.LoadDataCallback {
public IModel mModel;
public IView mView;
public Presenter(IView view) {
mView = view;
mModel = new Model();
}
@Override
public void loadData(String msg) {
System.out.println(msg);
mView.showProgress("这是加载框:数据正在加载中,请等待...");
mModel.getData(Presenter.this);
}
@Override
public void success(String msg) {
mView.showData(msg);
}
@Override
public void fail(String msg) {
System.out.println(msg);
}
}
复制代码
//View层接口---执行各种UI操作,定义的方法主要是给Presenter中来调用的
public interface IView {
void showProgress(String msg);
void showData(String data);
}
复制代码
//实现IView接口并实现各种UI操作的方法(其他的业务逻辑在Presenter中进行操作)
public class Main implements IView {
public static void main(String[] args) {
Main main = new Main();
main.doWork();
}
private void doWork() {
IPresenter mPresenter = new Presenter(Main.this);
mPresenter.loadData("开启网络请求...");
}
@Override
public void showProgress(String msg) {
System.out.println(msg);
}
@Override
public void showData(String data) {
System.out.println(data);
}
}
复制代码
输出结果
开启网络请求...
这是加载框:数据正在加载中,请等待...
3秒过去了,请求成功
复制代码
总结
通过上面的代码可见,MVP模式就是将Main类中的业务和视图逻辑进行抽取分别给Model和Presenter来进行操作,但显而易见的是,增加了很多额外的类,一定程度上增加了开发量。
另外,若一个页面有更多的操作,MVP的优势将更加明显,同时,这也方便后续的新成员更容易理解该页面的逻辑。