Android-Arch-summary
本文主要列举一些常见的架构及自己的理解.
MVC
经典 MVC 架构, 是在 1979 年由 Trygve Reenskaug 在这篇论文中提出的, 这里附上一篇 winter 老师的翻译, 当时文章提到的关键词有 Model
, View
, Controller
和 Editor
.
那时候并没有操作系统和消息循环(即不像现在的 Android ,不是事件驱动), 当时更多是面对鼠标, 键盘驱动这样的底层环境, 甚至鼠标的光标 UI 都要自己绘制.
原作者给出的关系图是这样的
Model
Model 是计算机对现实世界建立的模型, 可以是数据存储, 也可以是数据对象.
Controller
因为用户是接触鼠标和键盘, 所以输入是从 Controller 开始, Controller 根据指定的输入选择相应的 View 来显示, 即 Controller 与 View 是一对多的关系.
View
View 是 model 的表现形式, 可以从一个或多个 model 获取想要的数据. View 向 model 获取数据, 也可以更新 model. View 不知道用户输入, 只是用来展示给用户.
Editor
Controller 与 View 连接, 而某些 View 提供一种特殊的 Controller, 即 Editor, 它允许用户修改 View 表示的信息.
由于当年的开发环境与现在有很大不同, 所以我认为经典MVC架构已经不适用于现在的开发.
1996年, Mike(提出 MVP 架构)对当时的开发架构以 MVC 的角度给出了另一个依赖关系图:
此时用户输入已经从 Controller(mouse.onClick) 转移到 View (View.onClick) 上.
Android 中的 MVC
Android 并不是完全符合 MVC 架构, 各组件之间并不是能够完全解耦. 以下是我的理解:
View : xml布局, 即用户接触到的界面和控件.
Model: Java 对象, POJO 和 Java Bean, 还有一些数据中心, 如 Retrofit 的 Service.
Controller: Activity 或 Fragment. 因为 View 不能根据逻辑控制自己, 所以 Controller 会操作 View, 同时也会获取数据. 这些操作都放在 Controller 里面了.
MVP
随着计算机的发展, 操作系统对开发提供的帮助越来越多, Controller 所提供的桥梁功能, 已经逐渐被操作系统代替. 而 Mike 提出的 Presenter , 只是在 MVC 的基础上对 Controller 做了更详细的规定:
他在论文中提到 we refer to this kind(指应用程序全局且使用interactor, command以及selection概念的) of controller as a presenter
, 所以 Presenter 也是一种 Controller. MVC 和 MVP 的依赖关系图是一样的.
Android 中的 MVP
Android 中的 MVP, Presenter 作为桥梁的功能更加明显, 但是也有一些变种类型, 比如 Google 的 MVP 模式, 添加了 Contract 作为合约类, 定义了 View 和 Presenter 之间的接口, 而 Model 则作为数据中心, 提供所有获取数据的接口, Prsenter 中只需要选择是使用测试的 Data Repo 还是 正式的 Data Repo 即可.
这里我习惯用另一种 MVP:
View: Activity 和 Xml, 作为页面的展示, Activity 控制 View 的逻辑.
Model : Java 对象. 部分共用的 Data Repo.
Presenter : 每个 View 对应一个 Presenter, Presenter 获取数据(Retrofit 或 DataBase).
Contract : 约定 View 与 Presenter 之间的接口.
按照 Google 的做法, MVP 中 Model 应该包含数据中心, 负责提供获取数据的接口. 这样确实方便切换和测试. 但是实际项目中, 我认为大部分接口都只调用一次, 并且是在特定的页面, 所以我没有这样做.
MVVM
由于现在大部分开发的模式是标记语言 + 程序语音的组合, 如 (Android 的 Java + xml), view 与其他部分解耦得更加彻底, 2005年微软架构师在这篇文章中提出了 MVVM 的概念, 最重要的一点便是 View 和 ViewModel 之间实现了双向绑定.
View : xml 和 Activity, 与用户交互.
Model : 数据中心.
ViewModel: 其实只是普通 Java 类, 因为有 binding 的关系, 可以控制 View.