利用状态机处理复杂业务逻辑

我们来设想这么一种情形,需要实现一个下载按钮,这个下载按钮有这么如下几个功能:

button status

  1. 该 Item 没有对应的下载记录时,显示下载按钮。
  2. 如果有对应的下载任务,且在进行中,显示继续操作。
  3. 如果当前网络环境在 4G 中,进行下载的时候,需要用户确认后才能进行操作。
  4. … …

是不是想想就很头疼,这个按钮是该有多复杂的情形呀,难免在代码中会有不少 if-else if - else 的代码,可想而知,出错误的可能会非常得多。这篇文章就是说说,有没有什么好的方法来解决这个问题了?


状态机

对于学习计算机和软件的同学而已,多多少少是了解状态机的。本身我们所使用的计算机,都是基于图灵状态机。我们可以这样来理解状态机。

有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。

对于我们所书写的 Android 业务而已,其实也是一个状态机,所有的 UI 样式变化,都是对某种特定状态的响应。例如当下载任务进入暂停状态的时候,下载按钮要响应这个变化,变成 继续 样式,当下载按钮完成状态达成后,显示成 打开 样式。

是不是感觉到了什么?


不变的与变化的

在软件的开发中,我们常常要抽离变化的不变的,让他们各自分离,在这样的情形下,容易达到好的扩展性。我们再来看看,对于前文提及的下载按钮这个例子,什么是变化的,什么是不变的?

stay&move

不变的:

1. 下载实现(读取字节流、写入文件、等等)
2. 按钮点击事件

变化的:

1. 按钮样式
2. 业务逻辑 (是否在4G下弹出警告、下载完成后的打开操作、等等)

在进行分析之后,我们想象如何把这些不变的,与变化的进行分离,同时让它们能够共同协作起来。答案就是前文提及的,状态机

不变的,例如下载线程、文件写入、下载信息持久化等等,在这些过程发生完成后,改变对应的状态。变化的,按钮样式、打开操作等等,在收到状态变化的时候,进行 UI 的调整。

那么如何落地实现呢?请看下期。


文档信息


Published: June 20 2017