本次翻译的是five.agency.android的博客文章。


The Clean Architecture Diagram

android单独clean模块 android clean architecture_业务逻辑

  • Clean Architecture的功能设计:
  • Dependency rule
  • Abstraction
  • Communication between layers

I. Dependency rule

android单独clean模块 android clean architecture_android单独clean模块_02


三个在红色框框内的箭头表示依赖:

  • 外层可以访问内层。
  • 内层不能访问外层。
  • 内层包含了业务逻辑,外层包含了实现的细节。

没人能阻止一个不知道或者不遵循此条规则的人,所以需要利用一些技巧来保证所有的操作safety!
比如Android中的Module dependencies构建依赖规则,其中的implemente还以保证不能跨层访问。

II. Abstraction

一句话:内层是抽象的,外层是具体的。

android单独clean模块 android clean architecture_Dependency_03


一个例子将之说清楚。

  • 我们可以将抽象接口定义为“ Notifications”,并将其放在内部层中。
  • 这样,您的业务逻辑便可以使用它在需要时向用户显示通知。
  • 另一方面,在外层,实现该接口:该实现使用Android通知管理器显示通知。

当将 AbstractionDependency rule 结合使用时,使用通知的抽象业务逻辑既看不到也不知道使用Android通知管理器的具体实现,继而甚至可以切换具体的实现而不被业务逻辑感知。

III. Communication between layers

我们需要当业务逻辑,也就是内层设计位于数据流之间时的解决方案。

举个例子,业务逻辑如何将从 Internet 获取的数据呈现在 UI 上?

Internet细节和UI细节位于外层,业务逻辑位于内层,根据 Dependency rule 规则,业务逻辑不能访问外层,只能访问自己。如何设计?

like this:

android单独clean模块 android clean architecture_Dependency_04


图的主要部分上的箭头代表组成和继承,由实心箭头表示的组合,继承为空箭头,组合也称为has-a关系,而继承is-a关系。

  • Controller持有一个Use Case Input Port,实际上是对其具体实现的引用。
  • Use Case实现了Use Case Input Port(在同一层)
  • Use Case持有一个Use Case Output Port,实际上是对其具体实现的引用(在同一层)。
  • Presenter实现了Use Case Output Port。

总之,通过组合和继承,我们可以实现数据双向流动,这就是层与层之间的通信。