🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### [**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)