Android MVP模式

说到MVP模式,先来回顾一下MVC模式:model-view-control

Android中的MVC的角色定义分别为:

  • 模型层(Model)
    我们针对业务模型,建立的数据结构和相关的类,就可以理解为Model,Model是与View无关,而与业务相关的。

  • 视图层(View)
    一般采用xml文件或者java代码进行界面的描述,也可以使用javascript+html等的方式作为view层。

  • 控制层(controller)
    android的控制层通常在acitvity、Fragment或者由它们控制的其他业务类中。

Android中国MVP模式的定义为:model-view-presenter

  • Presenter
    作为View和Model的沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。

  • Model
    主要提供数据的存取功能。Presenter需要通过Model层来存储、获取数据。

  • View
    负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、Fragment类或者是某个View控件。

附上一张很经典的MVC-MVP对比图

Android MVP模式



在项目中:view层、model层和presenter层完全分离,view层用来加载视图和展示数据、model层用来处理数据、presenter层用来对model和view层进行交互

在model层 ,首先创建一个model的bean类UserInfo,同时创建一个获取这个model的bean的接口类IUserInfoModel,此接口类中有一个回调监听接口OnInfoChangedListener,定义了网络访问的各种状态:onerror、onsuccess等。接下来,创建接口类IUserInfoModel的实现类IUserInfoModelImpl,重写该接口的方法,用来获取bean的数据

在presenter层,首先定义一个接口IUserInfoPresenter,创建一个实现了该接口的实现类IUserInfoPresenterImpl,此实现类中分别定义了用来展示bean数据的view对象、bean数据对象,通过listener接口调用IUserInfoModelImpl对象来获取数据并回调给自身,最后通过view和activity来进行交互,更改界面。

其实,Presenter就是一个中间人的角色,他通过Model来获得并保存数据,然后在通过View来更新界面。

在view层:定义一个展示bean的view的接口IUserInfoView。在activity中来调用IUserInfoModelImpl,此activity实现了IUserInfoView接口,用来接收回调更新界面,很明显MainActivity并没有做其他与界面无关的事情。

MVP的优缺点

优点

  • 降低耦合度,实现了Model和View真正的完全分离。
  • 模块职责划分明显,层次清晰。
  • Presenter可以复用,一个Presenter可以用于多个View,而不需要更改Presenter的逻辑(当然是在View的改动不影响业务逻辑的前提下)。
  • 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

缺点

  • 额外的代码复杂度及学习成本。
  • 如果Presenter过多地与特定的视图的联系过于紧密,一旦视图需要变更,那么Presenter也需要变更了。
简要总结MVP三者之间的关系是:View和Model之间没有联系,View通过接口与Presenter进行交互,Model不主动和Presenter联系,被动的等着Presenter来调用其接口,Presenter通过接口和View/Model来联系。


参考链接:

http://blog.csdn.net/itachi85/article/details/52293236