• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Gofsm

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
package fsm

import (
    "log"
)

type EvtIf interface {
    GetEvtType() string
}

type Action interface {
    //doAction(evt EvtIf, srcState *State, dstState *State)
    doAction(evt EvtIf)
}

type Transition struct {
    dstState *State
    action   Action
}

type State struct {
    name          string
    isEnd         bool
    transitionTbl map[string]Transition
}

type fsm struct {
    InstId        uint64
    version       uint32
    startPoint    *State
    current       *State
    transitionLog []Transition
    stateTbl      map[string]*State
}

//func StartStateMachine(transtionLog []Transition) *fsm {
//}
//func ReplyStateMachine(transtionLog []Transition) *fsm {
//}
//func Save() *fsm {
//}
//func Load() *fms {
//}

func NewState(name string, end bool) *State {
    return &State{name, end, map[string]Transition{}}
}

func (this *State) GetName() string {
    return this.name
}

func (this *State) InterestInEvt(evt EvtIf) bool {
    if evt == nil {
        return false
    }
    _, exists := this.transitionTbl[evt.GetEvtType()]
    return exists
}

func (this *State) AddTransition(evt EvtIf, dst *State, action Action) {
    if evt == nil || dst == nil || action == nil {
        log.Fatal("AddTransition error, parameter invalid!")
    }
    _, exists := this.transitionTbl[evt.GetEvtType()]
    if exists {
        log.Fatal("AddTransition error,EvtIf exist")
    }
    this.transitionTbl[evt.GetEvtType()] = NewTransition(dst, action)
}

func (this *State) GetTransition(evt EvtIf) *Transition {
    if evt == nil {
        return nil
    }

    tran, exists := this.transitionTbl[evt.GetEvtType()]
    if exists == false {
        log.Fatal("GetTransition error,EvtIf doesn't exist")
    }
    return &tran
}

func NewTransition(dstState *State, action Action) Transition {
    return Transition{dstState, action}
}

func (this *fsm) RegisterState(state *State) {
    if state == nil {
        log.Fatal("RegisterState error, parameter invalid!")
    }
    _, exists := this.stateTbl[state.GetName()]
    if exists {
        return
        log.Fatal("RegisterState error,State exist")
    }
    this.stateTbl[state.GetName()] = state
}

func (this *fsm) AddTransition(srcState *State, evt EvtIf, dstState *State, action Action) {
    if srcState == nil || dstState == nil || evt == nil || action == nil {
        log.Fatal("AddTransition error, parameter invalid!")
    }
    this.RegisterState(srcState)
    this.RegisterState(dstState)
    srcState.AddTransition(evt, dstState, action)
}

func (this *fsm) AddInternalTransition(srcState *State, evt EvtIf, action Action) {
    this.AddTransition(srcState, evt, srcState, action)
}

func (this *fsm) HandleEvt(evt EvtIf) {
    if evt == nil {
        return
    }

    srcState := this.current
    if srcState.InterestInEvt(evt) {
        transition := srcState.GetTransition(evt)
        log.Printf("Handle Event, srcState:%s, dstState:%s, evt:%s", srcState.GetName(), transition.dstState.GetName(), evt.GetEvtType())
        //transition.action.doAction(evt, srcState, transition.dstState)
        transition.action.doAction(evt)
        this.current = transition.dstState
    } else {
        log.Printf("parameter invalid, srcState:%s, evt:%s", srcState.GetName(), evt.GetEvtType())
    }
}

func NewFsm(initialState *State) *fsm {
    if initialState == nil {
        log.Fatal("NewFsm error, parameter invalid!")
    }
    return &fsm{initialState, map[string]*State{}}
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
04.go数组发布时间:2022-07-10
下一篇:
Go: 正则匹配示例发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap