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);
}
}
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