松鼠状态机学习

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
    implements UntypedStateMachine{

    public static class AtoBCondition extends AnonymousCondition {

        @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);
    }
}
松鼠状态机学习_第1张图片
image.png

pom文件:




  4.0.0

  org.example
  squirrelStateMachineTest
  1.0-SNAPSHOT

  squirrelStateMachineTest
  
  http://www.example.com

  
    UTF-8
    1.8
    1.8
  

  

    
      junit
      junit
      4.12
      test
    

    
      org.squirrelframework
      squirrel-foundation
      0.3.8
    

    
      org.projectlombok
      lombok
      1.18.4
      provided
    

  


你可能感兴趣的:(松鼠状态机学习)