前言
状态机的概念可能比任何阅读此参考文档的人都要古老,而且肯定比Java语言本身还要早。有限自动机的描述可以追溯到1943年,当时沃伦·麦考切奇和沃尔特·皮茨先生撰写了一篇关于它的论文。 后来,在1955年,乔治·H·梅利提出了状态机的概念(称为“梅利机器”)。一年后,在1956年,埃德温·F·穆尔又发表了一篇论文,在这篇论文中他描述了被称为“摩尔机器”的东西。如果你曾经读过任何关于状态机的内容,“梅利”和“摩尔”的名字应该在某个时候出现过。
此参考文档包含以下部分:
简介 包含了对该参考文档的介绍。
使用Spring状态机 描述了Spring状态机(SSM)的用法。
状态机示例 包含了更多的状态机详细示例。
FAQ 包含常见问题。
附录 包含了关于所用材料和状态机的一般性信息。
介绍
1. 背景
状态机非常强大,因为它们的行为总是保证一致,并且由于在机器启动时操作规则被明确写明,因此相对容易调试。这个想法是你的应用程序现在处于有限的状态之一。然后某些事情发生,将你的应用程序从一个状态转移到下一个状态。 状态机由触发器驱动,这些触发器可以基于事件或计时器。
在应用程序外部设计高级逻辑并以各种不同的方式与状态机交互要容易得多。您可以通过发送事件、监听状态机的操作或请求当前状态来与状态机进行交互。
传统上,当开发人员意识到代码基础开始变得像一团意大利面时,才会在现有项目中添加状态机。意大利面条代码看起来像是一个无尽的、分层结构的IF、ELSE和BREAK语句块。当事情开始变得过于复杂时,编译器可能应该要求开发者回家休息了。
2. 使用场景
一个项目在以下情况下是使用状态机的良好候选对象:
-
您可以将应用程序或其部分结构表示为状态。
-
您希望将复杂的逻辑拆分成更小的可管理任务。
-
The application is already suffering concurrency issues with (for example) something happening asynchronously.
你已经在尝试实现一个状态机,当您执行以下操作时:
-
使用布尔标志或枚举来建模情况。
-
在某些应用生命周期的部分中才有意义的变量。
-
循环遍历一个 if-else 结构(或更糟糕的是,多个这样的结构), 检查某个特定标志或枚举是否设置,并且在某些标志和枚举存在或不存在的情况下进一步做出例外处理。