### [**Google官方MVP**](https://github.com/googlesamples/android-architecture/tree/todo-mvp/)
- 背景:多家公司有自己的MVP架构,没有统一的标准
- 目的
- 提供基本的[Model-View-Presenter](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter)(MVP)架构,而不使用任何架构框架
- 作为比较和对比本project中其他示例的一个参考点。
- 注意:此项目在所有存储库分支中使用以下命名约定来区分View类和MVP视图:
- “Android视图”是指android.view.View类。
- 从MVP中的演示者 presenter 接收命令的视图被称为“视图”。
- 下图为MVP官网demo中包架构图
![](https://i.imgur.com/Drpkm6f.jpg)
上图中的包含义如下所示
- Tasks 包:可以显示任务列表,用于管理任务列表
- TaskDetail 包:显示任务详情,用于读取或删除任务。
- AddEditTask包:添加和编辑任务,用于创建或编辑任务。
- Statistics 包:用来显示任务的完成情况,显示与任务相关的统计信息
- data包:数据模块对应MVP的Model
- util包:通用的方法
- 接口BasePresenter和BaseView:是Presenter层接口和View层接口的基类,项目中所有的Presenter接口和View层接口都继承自这两个接口。
#### **MVP设计示例**
在这个版本的应用程序(即上述官网的MVP示例,结构如上图所示),以及基于它的其他版本,每个屏幕screen是使用以下类和接口实现的:
- 一个定义MVP视图(MVP中的View)和演示者(Presenter)之间的连接的契约类。
- 一个创建Fragments片段和Presenters演示者的Activity活动。
- 一个实现View Interface接口的Fragment。
- 一个在相应关联的实现了Presenter Interface 接口的Presenter演示者。
实现APP,如下图所示
![](https://box.kancloud.cn/e39f8476da608beff03868c02d9b31c9_584x322.png)
在上面的插图中,该版本的应用程序使用Fragment片段,这有两个原因:
- 同时使用这两种活动Activity和片段Fragment可以更好地分离对MVP实施的补充。在这个版本的应用程序中,活动Activity是创建和连接视图(View)和演示者(Presenter)的整体控制器。
- 片段Fragment的使用支持具有多个视图的平板电脑布局或UI屏幕。
这个版本的应用程序包括一些单元测试,包括演示者,存储库和数据源。该示例还包括依赖于假数据的UI测试,并通过依赖注入来提供假模块。
### **个人见解**
* **View**: 对于View层也是视图层,在**View层中只负责对数据的展示**,提供友好的界面与用户进行交互。在**Android开发中通常将Activity或者Fragment作为View层**。
* **Model**: 对于Model层也是**数据层**。它区别于MVC架构中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它**负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等**。
* **Presenter**:对于Presenter层他是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以**在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示**。这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同时也将业务逻辑从View中抽离。
**总结**:在MVP架构中**将这三层分别抽象到各自的接口**当中。**通过接口将层次之间进行隔离,而Presenter对View和Model的相互依赖也是依赖于各自的接口**。这点符合了接口隔离原则,也正是面向接口编程。在**Presenter层中包含了一个View接口,并且依赖于Model接口,从而将Model层与View层联系在一起。而对于View层会持有一个Presenter成员变量并且只保留对Presenter接口的调用,具体业务逻辑全部交由Presenter接口实现类中处理。**
**另外,MVP只是一种思想,具体的实现思路各不相同,具体问题具体分析,应该考虑各个方面,比如是否会内存泄漏等等。**
#### [官方架构及其扩展结构](https://github.com/googlesamples/android-architecture)
- 稳定的demo
![](https://box.kancloud.cn/0f790579e5428f8c3948b7b0b8d26f08_947x408.jpg)
- 过时的demo(已不再维护,但是还可以使用)
![](https://box.kancloud.cn/291f6d0ed8dce9d2944d37054e1ae417_953x266.jpg)
- 正在开发中的demo
![](https://box.kancloud.cn/4aec3e2749cf9bea9764870cf28d0f3d_961x337.jpg)
- 外部demo
![](https://box.kancloud.cn/c018f45b07851dcd7890488c9f122a22_902x256.jpg)
* todo-mvp: 基础的MVP架构。
* todo-mvp-loaders:基于MVP架构的实现,在获取数据的部分采用了loaders架构。
* todo-mvp-databinding: 基于MVP架构的实现,采用了数据绑定组件。
* todo-mvp-clean: 基于MVP架构的clean架构的实现。
* todo-mvp-dagger2: 基于MVP架构,采用了依赖注入dagger2。
* dev-todo-mvp-contentproviders: 基于mvp-loaders架构,使用了ContenPproviders。
* dev-todo-mvp-rxjava: 基于MVP架构,对于程序的并发处理和数据层(MVP中的Model)的抽象。
从上述的介绍中可以看出,对于官方给出所有的架构的实现最终都是基于MVP架构。所以在这里就对上面的基础的MVP架构todo-mvp进行分析。
#### **参考链接**:
[Android官方MVP架构解读](http://blog.csdn.net/ljd2038/article/details/51477475)
[Android MVP开发模式 google 官方Mvp架构详解](http://blog.csdn.net/jungle_pig/article/details/65626469)
[Android开发之MVP模式(根据google的demo的修改版) ](http://blog.csdn.net/Picasso_L/article/details/50515613)