Advertisement
  1. Code
  2. Android SDK

MVP (Model View Presenter ) 简介

by
Read Time:7 minsLanguages:
This post is part of a series called How to Adopt Model View Presenter on Android.
How to Adopt Model View Presenter on Android

Chinese (Simplified) (中文(简体)) translation by Shen Yun Court (you can also view the original English article)

当我们开发一个复杂的APP 时, 我们往往会遇到一些挑战, 这些挑战可能之前已经有人遇到了, 而且已经了一些很棒的解决方案. 这些解决方案通常被称作模式. 我们通常说它们是设计模式架构模式. 模式能够简化我们的开发, 所以我们应该尽可能去使用它们.

这篇教程会让你明白好设计的重要性, 以及为什么Android 的标准架构并不是完美的. 我们将讨论在开发Android APP 的过程中会遇到的一些潜在问题, 然后我会告诉你们怎么通过MVP 模式来提高APP 的可测试性和可靠性, 从而解决这些问题.

在这个教程中, 我们将探讨:

  • 在软件工程中使用已知架构的价值
  • 为什么改变Android 的标准架构会是一个很有意义的事情
  • Model View Presenter (MVP) 模式的关键概念
  • MVC 和MVP 的差别
  • MVP 怎么去适配Android SDK

作为这教程中的第一篇, 我们在这里将主要讨论MVP 模式的理论部分. 在第二篇中会有更多的动手实践.

1. Android 架构

在项目的开始阶段, 项目的设计会是一个焦点. 首先我们需要考虑的一点, 就是我们准备使用的架构会怎样定义我们APP 中不同元素之间的关联, 会确定什么样的规则来规范我们的开发.

总之, 一个框架或SDK 会要求我们按照它们指定的方式来做, 但是这并不一定适合我们的项目. 有时候, 并没有预定义好的, 或者正确的路, 而往往需要我们开发者自己去设计. Android SDK 需要按照它指定的方式来实现, 但这并不一定是最好的选择.

虽然Android 提供一个一个优秀的SDK, 但是它的架构并不是很寻常的, 往往会陷入自己的开发方式中, 特别是在开发需要长时间测试和维护的复杂项目的时候. 幸运的是, 我们能够选择多个架构来解决这个问题.

那么问题到底是什么呢?

这是一个相当棘手的问题. 有人说Android 提供的架构并没有任何问题. 通常, 它也能很好完成工作. 但是我们能够做得更好吗? 我强烈地相信是可以的.

由Android 提供的工具, 加上布局, Activity, 数据结构, 看起来是引导我们使用Model View Controller (MVC) 模式. MVC 是一个既定的模式, 旨在隔离应用程序中的不同角色. 这就是所谓的关注点分离.

这个架构创建下面3 层:

  • Model
  • View
  • Controller

每一层负责APP 的一个方面. Model 负责业务逻辑, View 负责用户界面, 而Controller 则让View 能够读取到Model.

Model View ControllerModel View ControllerModel View Controller

但是如果我们更仔细地分析Android 的结构, 特别是View (Activities, Fragments, 等等) 和Model (数据结构) 之间的联系, 就会发现这又不能算是MVC. 它和MVC 以及对应的角色有很大的区别. 它能够使你能够用自己的方式来创建一个最好的应用.

更具体地, 如果我们看看loader 和activities 或Fragments 之前的关联, 你会明白为什么我们需要更仔细区分析Android 的结构. Activities 或Fragments 需要负责去调用loader 来获取数据 它的存在完全和Activities 或Fragments 绑定在一起了, 以致没有办法来划分View 角色(Activity/Fragment) 和业务逻辑(Loader).

Loader and Activity RelationshipLoader and Activity RelationshipLoader and Activity Relationship

你怎么在一个数据(Loader) 和View (Activity 或Fragment) 紧密绑定在一起的应用程序中使用单元测试, 特别是这单元测试是要测试一段很简短的代码? 如果你在一个团队中修改别人的代码时, 而这项目并没有使用你已知的框架, 你怎么能够快速定位你要修改的问题呢?

如何解决呢?

我们能够通过使用不同的架构来解决. 幸运的是, Android SDK 允许我们选择不同的解决方案. 我们可以筛选出最适合的一个方案. Model View Controller (MVC) 是一个很好的选择, 但是一个更好的选择是Model View Presenter (MVP) 模式. MVP 使用和MVC 类似的方式开发, 但它能够更好地分离关注点, 可以最大化应用的可测试性.

想想Android 的架构, 我们能够得出:

  • Android 并不关系关注点是怎么划分的.
  • 最好离开Android 的架构, 因为它很可能在将来导致问题的产生
  • 缺少合适的架构会导致痛苦的单元测试
  • Android 允许我们选择多种不同的架构
  • MVP 是可选的最好的Android 架构之一

2. Android 上的Model View Presenter

正如我之前提到的, 关注点分离并不是Android 的最强点. 幸运的是, MVP 模式极大地提升了这一点. MVP 将一个应用程序划分为三层:

  • Model
  • View
  • Presenter

每一个都有自己的责任, 而这些层之前的通信, 则是由Presenter 来负责的. Presenter 是这几个部件中的中间人.

Model View PresenterModel View PresenterModel View Presenter
  • Model 持有应用的业务逻辑. 它控制数据的创建, 存储和修改.
  • View 是被动显示数据的界面, 并且转发用户的操作到Presenter.
  • Presenter 像中间人一样工作. 它从Model 获取数据, 并在View 上显示. 它也处理从View 转发过来的用户操作.

MVC 和MVP 之间的区别

Model View Presenter 是基于 Model View Controller 模式的. 他们共用几个相同的概念, 所以往往很难区分它们. Presenter 和Controller 是类似的角色. 它们都负责Model 和View 之间的通讯. 然而, Controller 并不是以Presenter 完全一样的方式去管理Model 和View.

Differences Between MVC and MVPDifferences Between MVC and MVPDifferences Between MVC and MVP

在MVC 模式中, View 层是智能的, 它能够直接从Model 获取数据. 但是在MVP 模式中, View 是完全被动的, 数据完全是从Presenter 派发过来的. MVC 的Controller 能够在多个View 中共享. 而在MVP 中, View 和Presenter 是一对一的关系, 因此, 一个Presenter 是和一个View 绑定的.

  • 在MVP 中, View 是不能够访问Model 的.
  • Presenter 和一个View 绑定.
  • MVP 中的View 完全是被动的.

这些概念性的不同, 使得MVP 模式能够更好的分离关注点, 3 个 核心层的划分也使得它能够提高程序的可测试性.

Activity, Fragment 和View 对象

有好几种方法在Android 中实现MVP 模式. 通常, Activity 和Fragment 被赋予View 的角色, 并且负责Presenter 和Model 的创建. View 也负责在配置改变时维护Model 和Presenter, 在View 最终销毁时通知它们.

其他View 对象, 例如RecyclerView, 也能够被当做时MVP 中的View. 在View 和Presenter 中是一对一的关系, 但有时在复杂的场景中一个View 也会需要多个Presenter.

到目前为止我们知道什么

  • 通过使用架构和设计模式, 我们能够让开发变得更简单和透明.
  • Android 缺少一个良好的架构.
  • 不使用明确的设计模式的话, 我们往往会走到一条困难重重的路, 特别是可维护性和可测试性方面的问题将特别多.
  • MVP 模式提高了关注点的分离, 方便了单元测试.
  • Presenter 沟通了View 和Model.
  • View 显示数据并转发用户操作到Presenter.
  • Model 负责应用的业务逻辑.
  • View 角色通常是让Activity 或Fragment 来担当.

总结

在下一篇中, 我们将在 Android 中实现MVP 模式. 我们尝试在这篇教程中学习到的概念, 探索这个模式的复杂性, 以及它对Android 的意义.

当这个序列的教程结束后, 你能够在你的项目中实现MVP, 创建你自己的框架, 或者是使用其他已知的解决方案. 我希望在下一篇中还能再见到你.

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.