美文网首页
松鼠状态机学习

松鼠状态机学习

作者: ccccaixiaohao | 来源:发表于2020-09-10 17:34 被阅读0次

1.参考博客

1.https://github.com/hekailiang/squirrel
2.https://www.yangguo.info/2015/02/01/squirrel/

2.DEMO

1.状态枚举类:

public enum StateEnum {
    A("状态A"),
    B("状态B"),
    C("状态C"),
    D("状态D");

    private String desc;

    StateEnum(String desc) {
        this.desc = desc;
    }
}

2.事件枚举类:

public enum EventEnum {
    TO_B("事件到B"),
    TO_C("事件到C"),
    TO_D("事件到D");

    private String desc;

    EventEnum(String desc) {
        this.desc = desc;
    }
}

3.上下文类:

@Data
public class StateContext {

    private StateEnum initState;
    private EventEnum event;

    private String id;

}

4.定义状态机类:

@States({
        @State(name = "A",initialState = true),
        @State(name = "B"),
        @State(name = "C"),
        @State(name = "D",isFinal = true)
})

@Transitions({
        @Transit(from = "A",to = "B",on = "TO_B",callMethod = "A_TO_B_Method",when = MyStateMachine.AtoBCondition.class),
        @Transit(from = "B",to = "C",on = "TO_C",callMethod = "B_TO_C_Method"),
        @Transit(from = "C",to = "D",on = "TO_D",callMethod = "C_TO_D_Method")
})

@StateMachineParameters(stateType = StateEnum.class, eventType = EventEnum.class, contextType = StateContext.class)
public class MyStateMachine extends AbstractStateMachine<UntypedStateMachine,Object,Object,Object>
    implements UntypedStateMachine{

    public static class AtoBCondition extends AnonymousCondition<StateContext> {

        @Override
        public boolean isSatisfied(StateContext context) {
            if(context.getId().equals("111")){
                return true;
            }
            return false;
        }
    }

    public void A_TO_B_Method(StateEnum from,StateEnum to,EventEnum event,StateContext context){
        System.out.println("this is a to b method");
        System.out.println("context+" + context.toString());
    }

    public void B_TO_C_Method(StateEnum from,StateEnum to,EventEnum event,StateContext context){
        System.out.println("this is b to c method");
        System.out.println("context+" + context.toString());
    }

    public void C_TO_D_Method(StateEnum from,StateEnum to,EventEnum event,StateContext context){
        System.out.println("this is c to d method");
        System.out.println("context+" + context.toString());
    }

}

5.状态机创建类:

public class StateMachineEngineBuilder {

    private UntypedStateMachineBuilder machineBuilder;

    public UntypedStateMachineBuilder getMyStateMachine(){
        if(machineBuilder == null){
            machineBuilder = StateMachineBuilderFactory.create(MyStateMachine.class);
        }
        return this.machineBuilder;
    }

}

创建状态机时,需要传入一个初始状态

public class StateFireEngine extends StateMachineEngineBuilder {


    public void fire(StateContext context){
        //可以用spring注入
        StateMachineEngineBuilder engine = new StateMachineEngineBuilder();
        UntypedStateMachineBuilder stateMachineBuilder = engine.getMyStateMachine();
        MyStateMachine machine = stateMachineBuilder.newAnyStateMachine(context.getInitState());
        machine.fire(context.getEvent(),context);


    }

}

6.测试类:

public class TestState {
    public static void main(String[] args) {
        StateContext context = new StateContext();
        context.setId("111");
        context.setInitState(StateEnum.A);
        context.setEvent(EventEnum.TO_B);

        StateFireEngine engine = new StateFireEngine();
        engine.fire(context);
    }
}
image.png

pom文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>squirrelStateMachineTest</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>squirrelStateMachineTest</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.squirrelframework</groupId>
      <artifactId>squirrel-foundation</artifactId>
      <version>0.3.8</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.4</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

</project>

相关文章

  • 松鼠状态机学习

    1.参考博客 1.https://github.com/hekailiang/squirrel2.https://...

  • 状态机学习

    函数指针 状态机学习之前先来了解下>>函数指针学习: 状态机学习

  • FPGA状态机

    其他参考:主要是区分moore状态机和mealy状态机的。[原创][FPGA]有限状态机FSM学习笔记(一)[转载...

  • 分布式系统基础-Lamport Clock

    最近在学习分布式系统的知识.在学习Raft算法时,看到其中有提到状态机.于是就去研究了一下状态机,在研究状态机的时...

  • Unity高级——状态机——有限状态机

    一、状态机 状态机能够分离逻辑代码,提高代码的可维护性和重用性 本节课我们来学习,在Unity中使用状态机,来实现...

  • 状态机基础知识

    这几天想研究下状态机,所以开始阅读了squirrel的代码,文档提到了建议先学习下状态机基础知识。所以学习了这方面...

  • 秋叶大叔的《高效学习7堂课》

    大叔说:“为什么靠学习无法缓解焦虑?”“因为你可能是松鼠型学习者。” 松鼠型学习者 松鼠在每年冬天来临前,到处捡松...

  • 设计模式-状态机

    对于一个状态机来说,需要分成2个部分来考虑状态机,一是状态机本身,二是状态机的实现。 状态机推演 只有状态机本身是...

  • 三国无双。

    1.状态机,有限状态机。

  • 状态机源码分析

    状态机源码 状态机初始化 HandlerThread、SmHandler,Loop使用子线程loop。 状态机树状...

网友评论

      本文标题:松鼠状态机学习

      本文链接:https://www.haomeiwen.com/subject/gdwpektx.html