MVP框架模式
MVP模式是MVC的一个演化版本,全称为:Model View Presenter
MVP会解除View与Model的耦合。分离显示层与逻辑层,他们之间通过接口进行通讯,降低耦合。
1、Presenter-------交互中间人
沟通View与Model的桥梁,它从Model层检索出数据后返回给View层,使得View与Model之间没有耦合。
2、View---------用户界面
View通常是指Activity、Fragment或者某个View控件,它含有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作转交给Presenter进行实现,最后presenter通过调用View逻辑接口将结果返回给View元素。
3、Model-------数据的存取
负责数据的存取,Presenter通过Model层存储获取数据,Model就像一个数据仓库。更直白得说,Model是封装了数据库DAO或者网络获取数据得角色,或着两种方式获取数据的集合。
MVP的优点:
- 将View与Model解耦,方便进行单元测试。
- 结构清晰,易于维护
- activity和fragment不再是controller层,而是纯粹的view层。
MVP缺点:
1、类与接口将会增多,增加了代码量
2、每个功能都得新增接口,presenter难以复用,比如该页面有许多网络请求,每个网络请求都得新增一个接口。后面新增一个页面发现只需要一个跟上个页面一样的接口,这时候如果复用上一个页面的presenter,那么就得实现其它用不到 的接口。
代码例子:
1、建立Contract(presenter与Activity需要继承的接口,IBasePresenter和IBaseLoadListView为基础的接口)
public interface AllGroupMemberContract { interface Presenter extends IBasePresenter { void getGroupUserList(boolean firstLoad, String groupId); } interface View extends IBaseLoadListView<GroupUserOuterClass.GroupUser> { void getList(List<GroupUserOuterClass.GroupUser> list); } }
2、建立ViewModel---------->GroupHttpAPi
3、建立presenter,AbsPresenter为基类。
public class AllGroupMemberPresenter extends AbsPresenter implements AllGroupMemberContract.Presenter { private AllGroupMemberContract.View view; private List<GroupUserOuterClass.GroupUser> list = new ArrayList<>(); public AllGroupMemberPresenter(AllGroupMemberContract.View view) { this.view = view; } @Override public void getGroupUserList(boolean firstLoad, String groupId) { list = GroupHttpAPi.getInstance().getGroupUserList(groupId) view.getList(list) } }
4、activity继承AllGroupMemberContract.View
public class AllGroupMemberActivity extends BaseActivity implements AllGroupMemberContract.View { AllGroupMemberPresenter presenter = new AllGroupMemberPresenter(this); @Override public void getList(List<GroupUserOuterClass.GroupUser> list) { } } public getData() { presenter.getGroupUserList(firstPage, groupId); } }
activity调用presenter的getGroupUserList方法,presenter调用ViewModel的方法,然后通过接口传给Activity