美文网首页
MVP模式的重新使用

MVP模式的重新使用

作者: XL_Man | 来源:发表于2017-05-16 10:15 被阅读0次

    过往

    过往使用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;
    }
    

    相关文章

      网友评论

          本文标题:MVP模式的重新使用

          本文链接:https://www.haomeiwen.com/subject/xbduattx.html