android学习笔记(1)--MVP设计模式
近期由于要做android大作业,需要做一个app出来。先从阅读开源的app开始,这次选择的app是MovieGuide(https://github.com/esoxjem/MovieGuide),在这个应用中用到了很多目前android开发比较实用的技术,诸如:MVP pattern, RxJava, Dagger 2 and Uncle Bob Martin's Clean Architecture approach等等,也是老师上课不会涉及到的东西,谨尊建腿教导,用博客记录学习过程中心中点点滴滴,这次先看看MVP设计模式。
首先需要看看MVC的架构:
-
其中View层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入
-
而Model层就是JavaBean实体类,用于保存实例数据
-
Controller控制器用于更新UI界面和数据实例
进入正题:
MVP是MVC在android中的变种,在android中Activity不仅承担了View的角色,还承担了一部分的Controller角色,V和C就耦合在一起,有必要在Activity中,把View和Controller抽离开来,而这就是MVP模式的工作目的。
MVP的核心思想:MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
UML图(重要):
上面一张简单的MVP模式的UML图,从图中可以看出,使用MVP,至少需要经历以下步骤:
-
创建IPresenter接口,业务逻辑的接口,实现类PresenterCompl(在这里可以方便地查看业务功能,由于接口可以有多种实现所以也方便写单元测试)
-
创建IView接口,视图逻辑的接口,实现类是当前的Activity/Fragment
-
Activity里包含了一个IPresenter,而PresenterCompl里又包含了一个IView并且依赖了Model。Activity里只保留对IPresenter的调用,其它工作全部留到PresenterCompl中实现
-
Model并不是必须有的,但是一定会有View和Presenter
- 通过IVIew和IPresenter,把Activity的
UI Logic
和Business Logic
分离开来,Activity just does its basic job! 至于Model嘛,还是原来MVC里的Model。
通过上面的介绍,MVP的主要特点就是把Activity里的许多逻辑都抽离到View和Presenter接口中去。
eg.一个项目中用MVP的目录结构可以是如下的模式:
更多体会需要到实际项目中感受,以上就是记录一些没什么乱用的理论知识。
下面看看在MovieGuide中是如何用用MVP设计模式的,
首先看detail目录中:
其中MovieDetailsActivity是承载MovieDetailsFragment的容器,然后在MovieDetailFragment中有MVP的设计模式,这其中调用了IMovieDetailsPresenter这个接口的一个实例:
@Inject
IMovieDetailsPresenter movieDetailsPresenter;
然后他本身也是IMovieDetailsView的一个实现:
public class MovieDetailsFragment extends Fragment implements IMovieDetailsView, View.OnClickListener
很明显可以看出,在这个Fragment中,我们就找到了MVP设计模式的痕迹,在下面的listing包中也都可以找到类似的结构:
这就是MVP在MovieGuide这个app中的实际应用,算是搞懂了一丢丢,感谢https://segmentfault.com/a/1190000003927200博文中的理论知识,讲的比我清楚多了。