MVP 简单的例子

来源:互联网 发布:午夜凶铃 知乎 编辑:程序博客网 时间:2024/05/19 03:24

首先提一下MVP模式是什么 :MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

MVP和MVC的区别
这里写图片描述

作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
虽然 MVC 中的 View 的确“可以”访问 Model,但是我们不建议在 View 中依赖 Model,而是要求尽可能把所有业务逻辑都放在 Controller 中处理,而 View 只和 Controller 交互。

Demo

//View 接口public interface NewsView {    void showProgress();    void addNews(List<NewsBean> newsList);    void hideProgress();    void showLoadFailMsg();}
//Model 接口public interface NewsModel {    void loadNews(String url, int type,OnLoadNewsListListener listener); }
// Presenter 接口public interface NewsPresenter {    void loadNews(int type, int page);}
//Model的实现类就是 实现业务逻辑public class NewsModelImpl implements NewsModel {    /**     * 加载新闻列表     * @param url     * @param listener     */    @Override    public void loadNews(String url, final int type, final OnLoadNewsListListener listener) {        OkHttpUtils.ResultCallback<String> loadNewsCallback = new OkHttpUtils.ResultCallback<String>() {            @Override            public void onSuccess(String response) {                List<NewsBean> newsBeanList = NewsJsonUtils.readJsonNewsBeans(response, getID(type));                listener.onSuccess(newsBeanList);            }            @Override            public void onFailure(Exception e) {                listener.onFailure("load news list failure.", e);            }        };        OkHttpUtils.get(url, loadNewsCallback);    } 
//这个是连接 Model和 view关键 public class NewsPresenterImpl implements NewsPresenter, OnLoadNewsListListener , SwipeRefreshLayout.OnRefreshListener{    private static final String TAG = "NewsPresenterImpl";    private NewsView mNewsView;    private NewsModel mNewsModel;    public NewsPresenterImpl(NewsView newsView) {        this.mNewsView = newsView;        this.mNewsModel = new NewsModelImpl();    }    @Override    public void loadNews(final int type, final int pageIndex) {        String url = getUrl(type, pageIndex);        LogUtils.d(TAG, url);        //只有第一页的或者刷新的时候才显示刷新进度条        if(pageIndex == 0) {            mNewsView.showProgress();        }        mNewsModel.loadNews(url, type, this);    }    @Override    public void onSuccess(List<NewsBean> list) {        mNewsView.hideProgress();        mNewsView.addNews(list);    }    @Override    public void onFailure(String msg, Exception e) {        mNewsView.hideProgress();        mNewsView.showLoadFailMsg();    }}
//最后在 Activity 或者Fragment中 完成调用 。public class NewsListFragment extends Fragment implements NewsView{    private NewsPresenter mNewsPresenter; //(1)    ....    ....     @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mNewsPresenter = new NewsPresenterImpl(this); //(2)        mType = getArguments().getInt("type");    }     @Override    public void showProgress() {        mSwipeRefreshWidget.setRefreshing(true);    }    @Override    public void addNews(List<NewsBean> newsList) {        mAdapter.isShowFooter(true);        if(mData == null) {            mData = new ArrayList<NewsBean>();        }        mData.addAll(newsList);        if(pageIndex == 0) {            mAdapter.setmDate(mData);        } else {            //如果没有更多数据了,则隐藏footer布局            if(newsList == null || newsList.size() == 0) {                mAdapter.isShowFooter(false);            }            mAdapter.notifyDataSetChanged();        }        pageIndex += Urls.PAZE_SIZE;    }    @Override    public void hideProgress() {        mSwipeRefreshWidget.setRefreshing(false);    }    @Override    public void showLoadFailMsg() {        if(pageIndex == 0) {            mAdapter.isShowFooter(false);            mAdapter.notifyDataSetChanged();        }        View view = getActivity() == null ? mRecyclerView.getRootView() : getActivity().findViewById(R.id.drawer_layout);        Snackbar.make(view, getString(R.string.load_fail), Snackbar.LENGTH_SHORT).show();    }    @Override    public void onRefresh() {        pageIndex = 0;        if(mData != null) {            mData.clear();        }        mNewsPresenter.loadNews(mType, pageIndex);//(3)    }    ...} 

代码不是完整项目,小白练手用的 大神勿笑。
源码地址 : https://github.com/WierZheng/EasyTime

1 0
原创粉丝点击