浅谈状态机的结构和动力机制

222 阅读3分钟

在UML(统一建模语言)中,状态机(State Machine)是用来描述系统或对象在其生命周期内所经历的不同状态以及这些状态之间的转换。状态机模型包括状态(States)、转移(Transitions)、事件(Events)和动作(Actions)。下面详细描述它们的结构和动力机制:

1. 结构

状态(States)

状态表示系统或对象在某一时刻的条件或情形。每个状态可以用来表示对象在某一时刻的属性值和活动。

  • 初始状态:标识状态机的开始点,通常使用黑色实心圆表示。
  • 简单状态:用来表示单一的条件或情形,通常用圆角矩形表示。
  • 复合状态:包含子状态的状态,用来表示更复杂的行为。
  • 终止状态:表示状态机的结束点,通常用带有内部圆的黑色圆表示。

转移(Transitions)

转移是状态之间的转换关系,表示从一个状态到另一个状态的路径。转移通常由触发事件和条件来激活。

  • 事件:触发状态转换的外部或内部事件。
  • 守卫条件:在事件触发后,只有当条件为真时,状态才会转换。
  • 动作:在状态转换时执行的行为。

2. 动力机制

事件驱动

状态机是事件驱动的,这意味着状态转换是由事件触发的。当一个特定事件发生时,状态机会检查当前状态和可能的转移条件,然后执行相应的转换。

条件判断

守卫条件是附加在转移上的布尔表达式,只有在守卫条件为真的情况下,转移才会发生。

动作执行

在状态转换过程中,可能会执行某些动作。动作可以在以下几种情况下执行:

  • 进入动作:在进入某个状态时执行的动作。
  • 退出动作:在退出某个状态时执行的动作。
  • 转换动作:在状态转换过程中执行的动作。

示例

下面是一个简单的UML状态机示例,描述了一个简单的订单流程。

@startuml
[*] --> 待处理 : 提交订单
待处理 -down-> 审核中 : 审核订单
审核中 -down-> 已审核 : 审核通过
审核中 -left-> 审核失败 : 审核不通过
审核失败 -up-> 待处理 : 重新提交

state 待处理 {
待处理 : 订单状态(待处理)
}

state 审核中 {
审核中 : 订单状态(审核中)
}

state 已审核 {
已审核 : 订单状态(已审核)
}

state 审核失败 {
审核失败 : 订单状态(审核失败)
}

已审核 -down-> [*] : 完成订单
@enduml

解释

  • 初始状态[*] --> 待处理 : 提交订单 表示订单初始状态是“待处理”。
  • 审核订单待处理 -down-> 审核中 : 审核订单 表示订单提交后,进入“审核中”状态。
  • 审核通过审核中 -down-> 已审核 : 审核通过 表示审核通过,进入“已审核”状态。
  • 审核不通过审核中 -left-> 审核失败 : 审核不通过 表示审核不通过,进入“审核失败”状态。
  • 重新提交审核失败 -up-> 待处理 : 重新提交 表示审核失败后,可以重新提交订单,状态返回“待处理”。
  • 完成订单已审核 -down-> [*] : 完成订单 表示订单审核通过后,订单完成。

这种设计方式可以清晰地描述系统或对象的生命周期,便于理解和维护。