在 2017年 Google I/O 上,Google 发布了新的 Android Architecture 组件,包括 LifeCycle/LiveData/Room 等。 这些组件的诞生,让我们对实现 Clean Architecture 得到了新思路。
首先带来的,当然是上面这张图,来自 Google Sample 里的 TODO 指向的原文 https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
图例里面画了四个同心圆,和一条从外往内的调用链。这是整个 Clean Architecture 的核心 —— 我们所有的依赖都是从圆外往圆内的。
Clean Architecture 的目标
- 不依赖于具体框架。我们的架构不依赖于一些已经存在的库提供的特性,这样就可以仅仅使用这些库来作为工具而不会陷入他们的运行环境所带来的限制中。
- 可测试。我们的业务规则在脱离了 UI/数据库/Web 服务或者任何额外的的元素。
- 独立于 UI。改变 UI 且不改变其他的系统组件是非常容易的,就像 Web UI 能很轻松的替换成 Console UI,并不会改变业务规则。
- 独立于数据库。你可以把你的数据库换成 Oracle/SQL Server/Mongo/BigTable/CounchDB 或者其他任意的数据库,你的业务规则也不会绑定与这些数据库的具体实现。
- 独立于其他任何额外的组件,事实上你的业务规则并不知道有外界的世界存在。
Clean Architecture 的几个要素
实体
这里被称作Entities,它封装了所有业务规则,它可以是一个包含业务逻辑方法的数据结构,对于它的改变,受外部的影响应该是最小的。
Use Cases
Use Cases 这一层封装了所有用户可能发起的所有业务逻辑,它封装了所有可能的用户的动作,并把整个数据流串联起来,从 Entitiy 中读取参数或者把结果封装成 Entity,显然,所有应用操作的改变都会影响 Use Cases 内部实现的改变。
接口适配层
接口适配层就是连接具体业务逻辑和框架的代码,担任设备(Android)和业务之间的桥梁了。
Clean Architecture 为我们很好的画出了一个蓝图,那么我们如何去构建它呢?
Google 给我们提供了很好的工具 —— Android Architecture Components,当下的版本是1.0.0-rc1
ViewModel
首先我们先看ViewModel
这个组件,它的本质是使用一个透明的Fragment
管理它的生命周期,所以我们可以看到官方这个图。
它可以在同一个Activity
中的不同Fragment
间共享一个实例,或者是一个Parent Fragment
下的所有Children Fragment
共享一个实例,但是不可以在Activity
之间共享实例,只要Activity
对象没有被销毁,那么我们的 ViewModel 对象就不会被销毁(比如屏幕翻转)。
我们可以把 Use Cases 逻辑封装到 ViewModel 里,让Activity
和Fragment
只做响应事件和关注 View 变化这两件事,那么简单的数据流就可以是这样:
我们注意到了,上层的调用,是属于Clean Architecture
中,外圆对内圆的调用,下层的LiveData
是我们即将介绍的内容,它使用观察者模式,来提醒 UI 层快速更新界面。
LiveData
LiveData
是属于Android Architecture Components
的另外一个组件,它严格依赖LifeCycle
—— 这个组件在AppCompat 26.1.0
中已经默认被AppCompatActivity
使用了,因此,我们可以直接使用 LiveData。那么在ViewModel
中,生成LiveData
对象,让Activity
和Fragment
去对这个LiveData
注册观察者即可。
和业务逻辑交互
ViewModel
和另一侧的业务逻辑交互,最后就变成了这样 —— 使用Use Case
类,来封装一组业务逻辑,Repository
负责对数据流的获取,并把他们存成Entity
返回给Use Case
,在ViewModel
作为Interface Adpater
把Entity
转为LiveData
总结
Clean Architecture 给了我们构建 MVP 的新思路,而Android Architecture Components
给了我们新工具来架设我们的架构,相信 Google 未来推出的新组件能让我们更好更清晰地实现我们想要的架构,不再为万能 Activity
和万能 Fragment
发愁
本文由 Gemini Wen 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 20, 2018 at 10:46 am