在 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 的目标

  1. 不依赖于具体框架。我们的架构不依赖于一些已经存在的库提供的特性,这样就可以仅仅使用这些库来作为工具而不会陷入他们的运行环境所带来的限制中。
  2. 可测试。我们的业务规则在脱离了 UI/数据库/Web 服务或者任何额外的的元素。
  3. 独立于 UI。改变 UI 且不改变其他的系统组件是非常容易的,就像 Web UI 能很轻松的替换成 Console UI,并不会改变业务规则。
  4. 独立于数据库。你可以把你的数据库换成 Oracle/SQL Server/Mongo/BigTable/CounchDB 或者其他任意的数据库,你的业务规则也不会绑定与这些数据库的具体实现。
  5. 独立于其他任何额外的组件,事实上你的业务规则并不知道有外界的世界存在。

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管理它的生命周期,所以我们可以看到官方这个图。
ViewModel LifeCycle

它可以在同一个Activity中的不同Fragment间共享一个实例,或者是一个Parent Fragment下的所有Children Fragment共享一个实例,但是不可以在Activity之间共享实例,只要Activity对象没有被销毁,那么我们的 ViewModel 对象就不会被销毁(比如屏幕翻转)。

我们可以把 Use Cases 逻辑封装到 ViewModel 里,让ActivityFragment只做响应事件和关注 View 变化这两件事,那么简单的数据流就可以是这样:

1.png

我们注意到了,上层的调用,是属于Clean Architecture中,外圆对内圆的调用,下层的LiveData是我们即将介绍的内容,它使用观察者模式,来提醒 UI 层快速更新界面。

LiveData

LiveData是属于Android Architecture Components的另外一个组件,它严格依赖LifeCycle —— 这个组件在AppCompat 26.1.0中已经默认被AppCompatActivity使用了,因此,我们可以直接使用 LiveData。那么在ViewModel中,生成LiveData对象,让ActivityFragment去对这个LiveData注册观察者即可。

和业务逻辑交互

ViewModel和另一侧的业务逻辑交互,最后就变成了这样 —— 使用Use Case类,来封装一组业务逻辑,Repository负责对数据流的获取,并把他们存成Entity返回给Use Case,在ViewModel作为Interface AdpaterEntity转为LiveData

View Model 调用业务逻辑.png

总结

Clean Architecture 给了我们构建 MVP 的新思路,而Android Architecture Components给了我们新工具来架设我们的架构,相信 Google 未来推出的新组件能让我们更好更清晰地实现我们想要的架构,不再为万能 Activity万能 Fragment发愁

标签: Android

添加新评论