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

松鼠状态机学习

作者: 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>
    

    相关文章

      网友评论

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

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