动态管理FSM的示例

举报
码乐 发表于 2025/04/03 10:00:36 2025/04/03
【摘要】 1 简介状态图(Statechart Diagram)主要用于描述一个对 象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action)。一般可以用状态机对一个对象的生命周期建模,状态图用于显示状态机(State MachineDiagram),重点在于描述状态图的控制流。 2 实现示例实现的订单状态管理程序,该程序使...

1 简介

状态图(Statechart Diagram)主要用于描述一个对 象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action)。

一般可以用状态机对一个对象的生命周期建模,状态图用于显示状态机(State MachineDiagram),重点在于描述状态图的控制流。

2 实现示例

实现的订单状态管理程序,该程序使用有限状态机(FSM)模拟订单的状态管理。然后,附加用状态图表示订单生命周期的状态和转移。

状态管理程序,订单状态与状态转换
订单状态:

		初始 (New)
		派送中 (In Transit)
		待确认 (Pending Confirmation)
		已完成 (Completed)
		已取消 (Cancelled)

状态转移规则:

		初始 → 派送中
		派送中 → 待确认
		待确认 → 已完成
		所有状态 → 已取消

代码实现

		// OrderStatus represents the state of an order
		type OrderStatus string

		const (
			New               OrderStatus = "New"
			InTransit         OrderStatus = "In Transit"
			PendingConfirmation OrderStatus = "Pending Confirmation"
			Completed         OrderStatus = "Completed"
			Cancelled         OrderStatus = "Cancelled"
		)

		// Order represents an order with its current status
		type Order struct {
			ID     string
			Status OrderStatus
		}

		// ValidTransitions defines the allowed state transitions
		var ValidTransitions = map[OrderStatus][]OrderStatus{
			New:               {InTransit, Cancelled},
			InTransit:         {PendingConfirmation, Cancelled},
			PendingConfirmation: {Completed, Cancelled},
			Completed:         {}, // No transitions from Completed
			Cancelled:         {}, // No transitions from Cancelled
		}

		// Transition attempts to change the order's state
		func (o *Order) Transition(newStatus OrderStatus) error {
			validStatuses, ok := ValidTransitions[o.Status]
			if !ok {
				return errors.New("invalid current status")
			}

			// Check if the transition is valid
			for _, validStatus := range validStatuses {
				if newStatus == validStatus {
					o.Status = newStatus
					fmt.Printf("Order %s transitioned to %s\n", o.ID, newStatus)
					return nil
				}
			}

			return errors.New("invalid transition")
		}

		func main() {
			// Create a new order
			order := &Order{
				ID:     "12345",
				Status: New,
			}

			// Attempt state transitions
			if err := order.Transition(InTransit); err != nil {
				fmt.Println("Error:", err)
			}
			if err := order.Transition(PendingConfirmation); err != nil {
				fmt.Println("Error:", err)
			}
			if err := order.Transition(Completed); err != nil {
				fmt.Println("Error:", err)
			}
			if err := order.Transition(New); err != nil { // Invalid transition
				fmt.Println("Error:", err)
			}
			if err := order.Transition(Cancelled); err != nil { // Transition to Cancelled
				fmt.Println("Error:", err)
			}
		}

状态图
The state diagram represents the control flow of the order lifecycle:

		+---------+      (派送)      +--------------+      (确认收货)       +----------------+
		|  初始   +----------------->|   派送中     +---------------------->| 待确认         |
		+---------+                  +--------------+                       +----------------+
		     |                              |                                        |
		     | (取消)                       | (取消)                                | (完成)
		     V                              V                                        V
		+---------+                  +--------------+                       +----------------+
		| 取消状态 |                  |  取消状态   |                       |    已完成      |
		+---------+                  +--------------+                       +----------------+

说明
初始状态 (New)

可以转移到 派送中 或直接 取消。
派送中 (In Transit)

可以转移到 待确认 或 取消。
待确认 (Pending Confirmation)

可以转移到 已完成 或 取消。
已完成 (Completed)

没有后续状态。
已取消 (Cancelled)

没有后续状态。
运行结果

		Order 12345 transitioned to In Transit
		Order 12345 transitioned to Pending Confirmation
		Order 12345 transitioned to Completed
		Error: invalid transition
		Error: invalid transition

3 小结

动态状态管理:通过状态图建模,明确了对象生命周期中可能的状态和控制流。
有限状态机:使用 Go 中的映射定义了允许的状态转移。
错误处理:不允许非法的状态回退或不支持的状态转移。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。