上面这张图是网上找的,可以明显得区别MVP和MVC
我们先看一下MVC
相当于我们得activity即要和我们得布局文件打交道,又要和我们得数据层打交道,使得我们得activity就会有相当多得代码,可读性降低,而MVP得出现,就刚好弥补了这一点
我们在看一下MVP
我们先来实现一个mvp结构
先看我们得M层,就一个接口,用来给activity提供网络加载出来得数据
public interface MainView extends IBaseView {
//显示图片(回调函数)
void showGirlView(List girls);
}
再看看model层,这里我们模仿从网络上加载图片
public class MainModel {
public List loadData() {
List data = new ArrayList<>();
data.add(new Girl(R.drawable.f1, "一星", "****"));
data.add(new Girl(R.drawable.f2, "一星", "****"));
data.add(new Girl(R.drawable.f3, "一星", "****"));
data.add(new Girl(R.drawable.f4, "一星", "****"));
data.add(new Girl(R.drawable.f5, "一星", "****"));
data.add(new Girl(R.drawable.f6, "一星", "****"));
data.add(new Girl(R.drawable.f7, "一星", "****"));
data.add(new Girl(R.drawable.f8, "一星", "****"));
data.add(new Girl(R.drawable.f9, "一星", "****"));
data.add(new Girl(R.drawable.f10, "一星", "****"));
return data;
}
}
再看看presenter层,在这里,我们通过view得showGirlView方法,将MainModel得到得数据,和MainView中的接口进行绑定
public class MainPresenter extends BasePresenter {
MainModel mainModel = new MainModel();
public void loadData(){
iMainView.get().showGirlView(mainModel.loadData());
}
}
然后就是我们得activity层,activity层继承MainView以后,就可以通过showGirlView方法得到刚才MainModel 加载得数据
public class MainActivity extends BaseActivity,MainView> implements MainView{
@Override
public void showGirlView(List girls) {
//表示层就会把数据填到girls上
listView.setAdapter(new GirlAdapter(this, girls));
}
}
就这样,我们在mainactivity中就可以得到网络加载得数据了,这里我为了体现MVP得结构,并没有贴出所有得代码,完整代码下载地址demo下载
我们发现在presenter层里面,我们将model层得到得数据,再一次得传递给了view层,我们可不可以直接将这一次解耦呢
iMainView.get().showGirlView(mainModel.loadData());
下面就是改良得方案,类似RXBus得方式,在model层得到数据,我们就通过单独得通道,分发出去,在想要这个数据得地方,注册接受呢
首先我们戴良model得数据加载,将得到得数据,放入通道里面
public class MainModel {
public void loadData() {
RxBusUtils.getInstance().chainProcess(new Function() {
@Override
public Object apply(Object o) throws Exception {
List data = new ArrayList<>();
data.add(new Girl(R.drawable.f1, "一星", "****"));
data.add(new Girl(R.drawable.f2, "一星", "****"));
data.add(new Girl(R.drawable.f3, "一星", "****"));
data.add(new Girl(R.drawable.f4, "一星", "****"));
data.add(new Girl(R.drawable.f5, "一星", "****"));
data.add(new Girl(R.drawable.f6, "一星", "****"));
data.add(new Girl(R.drawable.f7, "一星", "****"));
data.add(new Girl(R.drawable.f8, "一星", "****"));
data.add(new Girl(R.drawable.f9, "一星", "****"));
data.add(new Girl(R.drawable.f10, "一星", "****"));
return data;
}
});
}
}
RxBusUtils.getInstance().register(presenter);
就只需要在presenter里面通过调用这个方法,就可以得到model中得数据,并传递给view层
@RegisterRxBusUtils
public void getShowGirlsData(ArrayList girls) {
iBaseView.get().showGirlView(girls);
}
RxBusUtils.getInstance().register(MainActiviy.this);
在activity中,就可以直接通过这个方法,得到model中得数据
@RegisterRxBusUtils
public void getShowGirlsData(ArrayList girls) {
listView.setAdapter(new GirlAdapter(this, girls));
}
这样,就可以解耦presenter和view层了
我这里贴出RxBusUtils 中得方法,提供大家学习
public class RxBusUtils {
private static final String TAG = "RxBusUtils";
//订阅者集合
private Set
上面得方式,是以RXBus通道方式,提供学习使用 修改后得demo下载