动态管理FSM的示例
【摘要】 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)