前言

看了google官方的MVP模式结构和一些不同网络上的文章,有比较多优化之前所说的普通mvp模式的方案。今天就说说google官方推荐的一个mvp形式。


Contract类

google在原先mvp三层结构分开不同类和不同结构的基础上加入了一个叫Contract的类,中文翻译是契约的意思。主要作用就是将三层(M、V、P)或者两层(V、P)的接口做一个管理。至于为什么会出现只有两层,后面会说...

public class WXContract {
 interface View extends BaseView {
    void setData(List<WXInfoModle> list);
}

 interface  Presenter extends BasePresenter<View> {
    void loadData();
}  }

这是上一次我写微信好友列表的V层还有P层的接口,采用契约后我把改成了上面这样的代码。两个接口都存在继承,这是关系到mvp模式的封装问题。这里我是直接使用android studio的插件生成的。这里有这个插件的教程,可以看看:请输入链接描述
使用插件生成的代码也包括了BaseActivity和BaseFragment的封装,base的P层直接封装在它们的里面。同理,base的V层直接封装在base的P层。所以在实际使用时不需要实例出来。


关于Model层的应用问题

网上对于M层的作用出现得比较多的有两个版本,一个是像我之前写的用它来初始化数据,比如生成一个list或者网络请求拿数据,但是我看了比较多的文章包括google的官方版本他们都比较倾向将M层用作bean类来使用,就是仅仅只是用它来做自定义类的封装。而把数据的初始化之类的操作交给了P层。也就出现了上述所说的契约类只管理两层的接口,因为这样的话M层压根没有接口。本人暂时分析不出孰优孰劣。但我本人也倾向于第二种方案,毕竟P层如果单单是调用M层和V层的方法感觉有点浪费,而且代码也有点强迫症了(个人感觉~~)。
所以最后P层的代码就取代了原来M层的代码。在P层完成list的生成后直接后调给V层

public class WXPresenter extends BasePresenterImpl<WXContract.View> implements WXContract.Presenter{
 private List<WXInfoModle> list;

 @Override
 public void loadData() {
    list=new ArrayList<>();
    for(int i=0;i<10;i++){
        WXInfoModle wxInfoBean=new WXInfoModle();
        wxInfoBean.setUserName(i+"");
        wxInfoBean.setInfoDetail("Hello WeChat!");
        wxInfoBean.setInfoTime(i+"");
        list.add(wxInfoBean);
    }
    mView.setData(list);
}
 }

最后

这个是google官方对于MVP模式demo的GitHub,里面包括这种最基本的还有其他不同魔改版的mvp模式:请输入链接描述
还有上面说到插件这里也说一个有关Android的控件实例化、事件监听的注解式生成工具插件:请输入链接描述 用这个可以大大提高开发效率,说实话个人感觉findViewById是一个很坑的方法(控件多起来简直要命!)。

标签: Andorid MVP模式

添加新评论