MVP模式

250 阅读3分钟

MVP模式

引言

由于在android中,MVC模式中的C承担了C和V的作用,导致C中的代码十分混乱,难以阅读。现在MVP模式目前在android应用程序中被广泛使用,主要由于:

MVP优势

  • MVP模式将视图和业务逻辑相分离,减轻了C的负担,降低了耦合。
  • 视图和业务逻辑的代码被分别抽取到Model和Presenter中,曾经的C层变得简洁,提高了代码的可阅读性。
  • 业务代码被抽取到Presenter中,方便了单元测试。
  • 业务代码被抽取到Presenter中,避免了后台线程引用Activity或fragment,造成内存泄漏。

MVP的UML图

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的优势将更加明显,同时,这也方便后续的新成员更容易理解该页面的逻辑。