MVP模式的重新使用

2017-05-16  本文已影响0人  XL_Man

过往

过往使用MVP模式,我是将网络请求回来的DataVo,缓存在Model的。所以造成,View使用DataVo的时候,需要通过:View -> Presenter -> Model。这个过程其实是十分不方便的。因为Presenter和Model需要声明并实现DataVo的getter。

例子

以获取列表数据并显示的过程为例子,阐述这种不方便:
View接口:

// 接收列表刷新的事件
void loadRecyclerData();

// 加载数据成功的回调
void loadDataSuccess();

View实现:

public void loadRecyclerData() {
    mPresenterImpl.loadRecyclerData(page);
}

public void loadDataSuccess() {
    mAdapter.notifyDataSetChanged();
}

// 列表适配器
public class MyAdapter extend XXAdapter {
    public void onBindViewHolder(MyViewHolder mHolder, int position) {
        mHolder.setShowData(mPresenter.getRecyclerData(position);
    }
}

Presenter接口:

// 获取网络数据
void loadRecyclerData(int page);

// 获取缓存数据
DataVo getRecyclerData(int position);

Presenter实现:

void loadRecyclerData(int page) {
    new MyAsyncTask() {
       boolean doInBackground() {
            return mModel.loadRecyclerData(page);
        }
        void onPostExecute(boolean isSuccess) {
             if (isSuccess) {
                 mView.loadDataSuccess();
             }
        }
    }
}

DataVo getRecyclerData(int position) {
    mModel.getRecyclerData(position);
}

Model接口:

// 获取网络数据
boolean loadRecyclerData(int page);

// 获取缓存数据
DataVo getRecyclerData(int position);

Model实现:

private List<DataVo> mDataVos;

boolean loadRecyclerData(int page) {
    mDataVos = MyNetAction(URL, BODY);
    return mDataVos == null;
}

DataVo getRecyclerData(int position) {
    mDataVos.get(position);
}

可以看到,缓存数据在Model中,View获取要显示的数据,都必需通过Presenter -> Model获取。

使用新的约定

网络请求回来的数据,缓存在View中。
View接口:

// 接收列表刷新的事件
void loadRecyclerData();

// 加载数据成功的回调
void loadDataSuccess(List<DataVo> mDataVos);

View实现:

public void loadRecyclerData() {
    mPresenterImpl.loadRecyclerData(page);
}

public void loadDataSuccess(List<DataVo> mDataVos) {
    mAdapter.setData(mDataVos);
    mAdapter.notifyDataSetChanged();
}

// 列表适配器
public class MyAdapter extend XXAdapter {
    private List<DataVo> mDataVos;

    public void setData(List<DataVo> mDataVos) {
        this.mDataVos = mDataVos;
    }

    public void onBindViewHolder(MyViewHolder mHolder, int position) {
        mHolder.setShowData(mDataVos.get());
    }
}

Presenter接口:

// 获取网络数据
void loadRecyclerData(int page);

Presenter实现:

void loadRecyclerData(int page) {
    new MyAsyncTask() {
        List<DataVo> doInBackground() {
            return mModel.loadRecyclerData(page);
        }
        void onPostExecute(List<DataVo> mDataVos) {
            if (mDataVos != null) {
                mView.loadDataSuccess(mDataVos);
            }
        }
    }
}

Model直接以静态的方式实现:


public static List<DataVo> loadRecyclerData(int page) {
    mDataVos = MyNetAction(URL, BODY);
    return mDataVosl;
}
上一篇下一篇

猜你喜欢

热点阅读