【设计模式】状态模式和状态机的区别和联系

大多数资料、文章,都没有解释状态模式和状态机的关系,而是将这两个词混淆着使用。如果你有这方面的疑惑,希望本文能给你带来帮助。如果有描述不当的地方,也请帮忙指正

以下并不涉及状态模式/状态机的基础内容

一个比较好的,对该问题进行的讨论

  • stackoverflow-What is the difference between a state machine and the implementation of the state pattern?
  • The Super State Design Pattern

状态模式:一种程序设计模式

状态机:通常指FSM(有限状态机),是一个数学模型,是一种抽象机器,用state diagram(状态图、状态转换图)表示

ps:就像"行为树"也是一个数学模型,是一种抽象树

状态图就是这样的图
(图片出处)
【设计模式】状态模式和状态机的区别和联系_第1张图片
(图片出处)
【设计模式】状态模式和状态机的区别和联系_第2张图片

数学领域中的状态机

  • 状态机如同大多数数学模型一样,并不是编程领域特有的名词,而是为了解决某些问题而提出的数学模型
  • 状态机描述了在任何给定时间都处于某一个状态的计算机,它可以响应某些输入/触发/事件而从一种状态更改为另一种状态,它的关注点是状态及其转换
  • 许多工程和数学专业的学生已经了解了状态机,但他们在编程领域几乎没有受过教育,在他们看来,状态机是一个用"状态图"表示的数学模型、抽象机器。

编程领域中的状态模式

  • 状态模式是编程领域特有的名词,是一种设计模式。设计模式是为了更好地规范代码设计结构,以便于封装、复用、易于扩展;其中状态模式用来解决 对象根据自己的状态来展现出不同的行为
  • 状态模式是状态机的一种实现方式,但通常都是以状态模式的思路来实现状态机
  • 很多文章(尤其是国内博文)经常都把这两个词混淆使用,也完全可以理解。因为当你要用状态模式实现一个功能的时候,这个功能结构肯定不适合被称为"状态模式",而更适合称为"状态机"。这只是一个词性的区别,就像"一碗米饭"要"用碗盛"一样。
  • 然而状态模式和状态机的存在着很强的关联性,就像"一碗米饭"必须"用碗盛"一样,目前没看到有其它好的实现方式
  • 所以有些程序员认为状态机是"运行中的状态模式",这无可厚非

二者正确的关系是:假设需要开发一个上面状态图展示的糖果机程序,那么应该由产品经理绘制这个状态图来描述该状态机,然后交由程序员进行实现。程序员实现这个状态机的方式可能有很多,而最理想的方式就是状态模式。

你可能感兴趣的:(设计模式,状态模式,有限状态机,设计模式)