MVP设计模式的写法

来源:互联网 发布:电脑修复软件 编辑:程序博客网 时间:2024/05/22 05:14

Android里面用到的页面数据交互设计模式主要有三类,主要是MVC、MVP、MVVM,我用的最多的就是MVP,我个人觉得MVP更容易让人理解,因为它的逻辑性比较严密,而且也方便后期的在开发,当然缺点就是要写多写很多类和多写很多代码
主要分为三大块:
model:负责数据,持久化等操作
view:界面,视图,负责UI的绘制和用户的交互
present:连接model和view的桥梁
这里举个例子,这里的网络数据获取用到了OKHttp,还有JSON数据解析,用到了GSON
compile ‘com.zhy:okhttputils:2.6.2’
compile ‘com.google.code.gson:gson:2.8.0’
新建三个包:model、view、present
这里写图片描述
然后就是建类了,model、present、view分别写一个接口,比如这里view:

public interface ArticleCommentsView {    void showArticelComments(List<ResponseArticleComments.DataBean> dataBeen);    void showNoMoreDatas();    void showError();}

model:
//由于这里我使用了OKhttp进行网络数据的获取,所以写了一个回掉

public interface ArticleCommentsModel {    void loadDatas(String url, Callback callback);    void loadNoMoreDatas();    public interface Callback{        void loadArticleCommentsDatas(List<ResponseArticleComments.DataBean> dataBeen);        void loadNoMoreDatas();        void loadFailed();    }}

present:

public interface ArticleCommentsPresenter {    void loadDatas();//如果有什么关键字要从后台给的接口中post给服务器,括号里面要添加变量    //void loadDatas(String content);}

然后就是需要写实体类去实现这三个接口
model:

public class ArticleCommentsModelImpl implements ArticleCommentsModel {    @Override    public void loadDatas(String url, final Callback callback) {        OkHttpUtils.get().url(url).build()                .execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        callback.loadFailed();                    }                    @Override                    public void onResponse(String response, int id) {                        ResponseArticleComments comments = JSON.parseObject(response, ResponseArticleComments.class);                        if(comments.getData().getTotal().equals("0")){                            callback.loadNoMoreDatas();                            return;                        }                        callback.loadArticleCommentsDatas(comments.getData().getData());                    }                });    }    @Override    public void loadNoMoreDatas() {    }}

present://因为后台给的接口有页数,所以就添加了一个nextpage的翻页处理

public class ArticleCommentsPresenterImpl implements ArticleCommentsPresenter {    private ArticleCommentsModel model;    private ArticleCommentsView view;    private int nextpage = 1;    public ArticleCommentsPresenterImpl(ArticleCommentsView view) {        this.view = view;        this.model = new ArticleCommentsModelImpl();    }    @Override    public void loadDatas(String content) {        String url = UrlHandler.handlUrl(Apis.ARTICLE_COMMENTS, nextpage, content);        Log.d("ArticleCommentsPresente", url);        model.loadDatas(url, new ArticleCommentsModel.Callback() {            @Override            public void loadArticleCommentsDatas(List<ResponseArticleComments.DataBean> dataBeen) {                view.showArticelComments(dataBeen);            }            @Override            public void loadNoMoreDatas() {                view.showNoMoreDatas();            }            @Override            public void loadFailed() {                view.showError();                nextpage --;            }        });        nextpage ++;    }    @Override    public void refresh(String content) {    }}

然后mvp这边就写完了,剩下的就是在activity或者fragment中去处理这些了
比如:

public class ArticleDetailsActivity extends BaseActivity implements ArticleCommentsView {.....}

这里只需要对present接口类定义全局变量,然后在onCreate中进行实例化

·commentsPresenter = new ArticleCommentsPresenterImpl(this);commentsPresenter.loadDatas();

然后在实现view的方法里面进行数据和页面的交互处理
大体上就是这样了哦,希望对你有所帮助,谢谢了

UrlHandler 类:

public class UrlHandler {    /***     * http://cnblogs.davismy.com/Handler.ashx?op=GetTimeLine&channelpath={0}&page={1}     * {"data/123","1"}     */    public  static final String handlUrl(String url,Object... params){        for (int i = 0; i < params.length; i++) {            url = url.replace("{"+i+"}", params[i]+"");        }        return url;    }}
原创粉丝点击