• go


    FSM有限状态机

    /**
    * @Author: wsp
    * @Time    : 2018/4/11 16:45
    * @Description:
     */
    package fsmStrudy
    
    import (
        "fmt"
        "github.com/looplab/fsm"
    )
    
    type Door struct {
        To  string
        FSM *fsm.FSM
    }
    
    func NewDoor(to string) *Door {
        d := &Door{
            To: to,
        }
    
        d.FSM = fsm.NewFSM(
            "closed",
            fsm.Events{
                {Name: "open", Src: []string{"closed"}, Dst: "open"},
                {Name: "close", Src: []string{"open"}, Dst: "closed"},
            },
            fsm.Callbacks{
                "enter_state": func(e *fsm.Event) { d.enterState(e) },
            },
        )
    
        return d
    }
    
    func (d *Door) enterState(e *fsm.Event) {
        fmt.Printf("The door to %s is %s
    ", d.To, e.Dst)
    }
    func FsmStudy() {
       // 创建door对象 door :
    = NewDoor("heaven")    // 状态改变,此时对应fsm.Events中的Name:open状态,此时状态由closed转变为open
    // 然后调用回调函数 d.enterState(e),打印出当时状态 err :
    = door.FSM.Event("open") if err != nil { fmt.Println(err) } err = door.FSM.Event("close") if err != nil { fmt.Println(err) } }

    然后进行深一层次,丰富状态机转变时对应回调函数的调用及执行,类似java中拦截器,状态转变之前执行对应before_xxx的函数,

    执行完后执行leave_state的函数,代码:

    /**
    * @Author: wsp
    * @Time    : 2018/4/11 16:45
    * @Description: 有限状态机
     */
    package fsmStrudy
    
    import (
        "fmt"
        "github.com/looplab/fsm"
        "testing"
    )
    
    func TestFsmStudy(t *testing.T) {
        FsmStudy()
    }
    
    func TestFsmStudy2(t *testing.T) {
        //创建一个状态机
        //三个参数:1.默认状态 2.定义状态事件 3.定义状态转变时调用的函数
        fsm := fsm.NewFSM(
            "green",
            fsm.Events{
                //状态事件的名称   该事件的起始状态Src         该事件的结束状态Dst
                //即:状态事件warn(警告事件)表示事物的状态从状态green到状态yellow
                {Name: "warn", Src: []string{"green"}, Dst: "yellow"},
                {Name: "panic", Src: []string{"yellow"}, Dst: "red"},
                {Name: "yellow", Src: []string{"red"}, Dst: "blue"},
                {Name: "calm", Src: []string{"red"}, Dst: "yellow"},
            },
            //状态事件调用函数,在此称为 时机函数。关键字用'_'隔开,格式是:"调用时机_事件或状态"
            //before表示在该事件或状态发生之前调用该函数,如"before_warn",表示在warn
            //这个状态事件发生前调用这个函数。"before_yellow"表示进入yellow状态之前调用
            //该函数。
            //依此类推,after表示在...之后,enter表示在进入...之时,leave表示在离开...
            //之时。
            fsm.Callbacks{
                //fsm内定义的状态事件函数,关键字指定的是XXX_event和XXX_state
                //表示任一的状态或状态事件
                "before_event": func(e *fsm.Event) {
                    fmt.Println("before_event")
                },
                "leave_state": func(e *fsm.Event) {
                    fmt.Println("leave_state")
                },
                //根据自定义状态或事件所定义的状态事件函数
                "before_yellow": func(e *fsm.Event) {
                    fmt.Println("before_yellow")
                },
                "before_warn": func(e *fsm.Event) {
                    fmt.Println("before_warn")
                },
            },
        )
        //打印当前状态,输出是默认状态green
        fmt.Println(fsm.Current())
        //触发warn状态事件,状态将会从green转变到yellow
        //同时触发"before_warn"、"before_yellow"、"before_event"、"leave_state"函数
        fsm.Event("warn")
        fmt.Println("======================")
        fsm.Event("panic")
        fmt.Println("======================")
        fsm.Event("yellow")
        //打印当前状态,输出状态是yellow
        fmt.Println(fsm.Current())
    }
  • 相关阅读:
    echo "http://172.17.26.115:8380/?key=%c8%fd%d0%c7%ca%d6%bb%fa%b1%f9%cf%e4" | mail -s "noresult_monitr error" maolingzhi@jd.com
    python实现的文本编辑器
    PyQt写的浏览单web页面的browser
    中非发展基金
    团队介绍
    微众—国内最大的微信公众服务平台
    微软创投加速器简介
    知方可补不足~SQL为大数据引入分区表
    实时监控Cat之旅~介绍与自定义类型在哪里
    EF架构~Cannot attach the file as database
  • 原文地址:https://www.cnblogs.com/hcy-fly/p/8820617.html
Copyright © 2020-2023  润新知