MVP模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值