前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有限状态机模型

有限状态机模型

原创
作者头像
暮雨
修改2018-11-16 11:00:13
1.6K0
修改2018-11-16 11:00:13
举报
文章被收录于专栏:云端漫步云端漫步

在阅读harbor源码时,在jobservice代码中,发现实现了一个有限状态机。状态管理在系统设计中常被使用。通过实现它,可以方便的对程序的状态进行管理。状态在现实生活中,有很多存在的例子。例如,灯有开,关两种状态,当然如果较真的话,中间还可以有多个亮度的状态。红绿灯,登录状态,程序的生命周期等等,这个太多了。

状态机

有限状态机(英语:finite-state machine,缩写FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型

既然是一个数学模型,那么就可以按照数学的方式对其下定义。不是搞学术的,也就没必要对其深究,点到为止。

但是有两点需要特此说明,1. 状态集合是一个有限集合 2. 状态是离散的存在

对状态机进行抽象,可以归纳出以下属性:

1. 当前的状态

2. 事件

3. 行为

代码语言:go
复制

// 有限状态机数据结构
type FSM struct {
    mu       sync.Mutex                           // 排他锁
    state    string                             // 当前状态
    handlers map[string]map[string // 处理handle
}

以上,我们实现了一个状态机的数据结构,接下来,我们来实现这个状态机的方法,使得状态机能被外部使用。

1. 设置状态

代码语言:javascript
复制
// 获取当前状态
func (f *FSM) getState() FSMState {
    return f.state
}

2. 获取当前状态

代码语言:javascript
复制
// 设置当前状态
func (f *FSM) setState(newState FSMState) {
    f.state = newState
}

3. 添加handle

代码语言:javascript
复制
// 某状态添加事件处理方法
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. 触发事件

代码语言:javascript
复制
// 事件处理
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档