通过代码封装搭建合适的MVP开发架构模式

897

前言

在Android项目开发中,MVP架构的使用或许已经不是什么新鲜的事,现在网上的教程也非常多,而且Google也在GitHub上给出了实例。

不过有时候在项目开发过程中,也不完全照搬别人是怎样写的,重要的是自己理清MVP架构的思想,通过代码的封装,搭建合适自己开发常用的模式。(本文不会讲解什么是MVP架构,如果还没熟悉这种架构模式,请自行百度或谷歌咯)

接下来谈谈我是怎样通过代码封装来搭建合适我自己的MVP构架吧。

MVP架构模式的父类实现

  • BaseView

View层的父类。将常用的View层操作抽象出来,写成一个接口,具体的实现由Activity或Fragment来完成。

例如,在View层上,通过网络请求数据然后展示数据这样的一个过程,一般我是分成这几个步骤:

1. 网络请求开始前,需要打开数据加载框
2. 网络请求结束后,需要关闭数据加载框
3. 网络请求成功后,需要在view上显示数据
4. 网络请求失败后,需要在View上提示原因

转换成代码:

public interface BaseView<T> {

    /**
     * 打开加载框
     */
    void startLoadView();

    /**
     * 关闭加载框
     */
    void stopLoadView();

    /**
     * 网络请求成功后回调
     * @param data
     */
    void onSuccess(T data);

    /**
     * 网络请求失败后回调
     * @param msg
     */
    void onFail(String msg);

}
  • BaseRequestCallBack

数据请求的回调接口(我这里一般都是都过网络请求数据),在MVP架构模式中,Model层获取到数据后,会将数据交给Presenter中间层,最后再交回给View层,而在View层上的一些常用的操作,例如上面的讲解中提到的相对应,在不同的请求周期中对应不同的操作,而接口的具体的实现由Presenter层来完成。

public interface BaseRequestCallBack<T> {

    /**
     * 网络请求开始前回调
     */
    void RequestBefore();

    /**
     * 网络请求失败后回调
     */
    void RequestFail(String msg);

    /**
     * 网络请求成功后回调
     * @param data
     */
    void RequestSuccess(T data);

    /**
     * 网络请求结束后回调
     */
    void RequestComplete();
}
  • BasePresenter

Presenter层的父类,是Model层和View层之间的桥梁。上面说到的BaseRequestCallBack接口就是由BasePresenter来实现。

因为Presenter层是中间层,所以要持有View层的引用,继而完成数据的传递和完成不同的请求周期中对应View层的操作。

看看BasePresenter的代码:

public class BasePresenter <T> implements BaseRequestCallBack<T> {

    private BaseView mView; //持有View层的引用

    public BasePresenter(BaseView mView, Context context) {
        this.mView = mView;
    }


    /**
     * 以下的回调方法对应View层的相应操作
     */

    @Override
    public void RequestBefore() {
        mView.startLoadView();
    }

    @Override
    public void RequestFail(String msg) {
        mView.onFail(msg);
    }

    @Override
    public void RequestSuccess(T data) {
        mView.onSuccess(data);
    }

    @Override
    public void RequestComplete() {
        mView.stopLoadView();
    }
}
  • BaseModel

Model层的父类。一般得看开发者的需要,通过怎样的方式或框架去获取数据,然后进行相应的实现或参数的配置(网络请求框架,数据库框架等)

因为获取数据后,Model层需要将数据传递给Presenter层,所以在Model层需要持有Presenter层的引用。在这里,BaseRequestCallBack就可以派上用场了,直接可以对应网络请求框架的一些生命周期。

因为这里不同的开发者使用的网络请求方式不一样,所以这里我就贴出创建BaseRequestCallBack实例的代码。下面的注释掉的代码,就是我自己通过OKHTTP封装的网络请求框架。

public class BaseModel {
    //public NetworkRequestClient httpClient;
    private BaseRequestCallBack callBack;

    public BaseModel(BaseRequestCallBack callBack) {
        //httpClient = NetworkRequestClient.getInstance();
        this.callBack = callBack;
    }

     // public NetworkExecutor getExecutor(Class<?> mClass) {
    //     NetworkExecutor networkExecutor = new NetworkExecutor(new NetworkRequestListener() {
    //         @Override
    //         public void onRequestBefore() {
    //             callBack.requestBefore();
    //         }

    //         @Override
    //         public void onRequestSuccess(Object object) {
    //             callBack.requestSuccess(object);
    //         }

    //         @Override
    //         public void onRequestFail(String msg) {
    //             callBack.requestFail(msg);
    //         }

    //         @Override
    //         public void onRequestComplete() {
    //             callBack.requestComplete();
    //         }

    //     },mClass);
    //     return networkExecutor;
    // }

}

总结

这就是我通过代码封装搭建的一套MVP开发架构模式,当然每个人都可以持有不同的见解,这里只是提出我的一些做法,如有做的不好,还望指点。我就不贴具体的Activity的代码了,如果需要的话可以,去我的Github上拿。

最后,小弟不才,还望多多指教!