在阅读harbor源码时,在jobservice代码中,发现实现了一个有限状态机。状态管理在系统设计中常被使用。通过实现它,可以方便的对程序的状态进行管理。状态在现实生活中,有很多存在的例子。例如,灯有开,关两种状态,当然如果较真的话,中间还可以有多个亮度的状态。红绿灯,登录状态,程序的生命周期等等,这个太多了。
状态机
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
既然是一个数学模型,那么就可以按照数学的方式对其下定义。不是搞学术的,也就没必要对其深究,点到为止。
但是有两点需要特此说明,1. 状态集合是一个有限集合 2. 状态是离散的存在
对状态机进行抽象,可以归纳出以下属性:
1. 当前的状态
2. 事件
3. 行为
// 有限状态机数据结构
type FSM struct {
mu sync.Mutex // 排他锁
state string // 当前状态
handlers map[string]map[string // 处理handle
}
以上,我们实现了一个状态机的数据结构,接下来,我们来实现这个状态机的方法,使得状态机能被外部使用。
1. 设置状态
// 获取当前状态
func (f *FSM) getState() FSMState {
return f.state
}
2. 获取当前状态
// 设置当前状态
func (f *FSM) setState(newState FSMState) {
f.state = newState
}
3. 添加handle
// 某状态添加事件处理方法
func (f *FSM) AddHandler(state FSMState, event FSMEvent, handler FSMHandler) *FSM {
if _, ok := f.handlers[state]; !ok {
f.handlers[state] = make(map[FSMEvent]FSMHandler)
}
if _, ok := f.handlers[state][event]; ok {
fmt.Printf("[警告] 状态(%s)事件(%s)已定义过", state, event)
}
f.handlers[state][event] = handler
return f
}
4. 触发事件
// 事件处理
func (f *FSM) Call(event FSMEvent) FSMState {
f.mu.Lock()
defer f.mu.Unlock()
events := f.handlers[f.getState()]
if events == nil {
return f.getState()
}
if fn, ok := events[event]; ok {
oldState := f.getState()
f.setState(fn())
newState := f.getState()
fmt.Println("状态从 [", oldState, "] 变成 [", newState, "]")
}
return f.getState()
}
通过以上方法,就可以对状态进行管理。
参考:https://cloud.tencent.com/developer/article/1075931
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。