import com.alibaba.cola.statemachine.StateMachine;
import com.alibaba.cola.statemachine.builder.StateMachineBuilder;
import com.alibaba.cola.statemachine.builder.StateMachineBuilderFactory;
import lombok.Data;
import lombok.Getter;

/**
 * 测试cola状态机驱动
 *
 * @author ext.niehuibin1
 * @date 2025/5/15 11:08
 */
public class TestColaStateMachina {

  //
  // <dependency>
  //    <groupId>com.alibaba.cola</groupId>
  //    <artifactId>cola-component-statemachine</artifactId>
  //    <version>4.2.0</version>
  // </dependency>

  /** 状态机id */
  public static final String MACHINE_ID = "mba";

  public static void main(String[] args) {
    MbaContext mbaContext = new MbaContext();
    //    mbaContext.setScore(80.0);

    runStateMachine(MbaState.EXAM_FIRST_PENDING, MbaEvents.FIRST_EXAM, mbaContext);
  }

  private static void runStateMachine(MbaState initState, MbaEvents event, MbaContext context) {
    // 第一步:生成一个状态机builder
    StateMachineBuilder<MbaState, MbaEvents, MbaContext> builder =
        StateMachineBuilderFactory.create();

    // 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform
    builder
        .externalTransition()
        .from(MbaState.EXAM_FIRST_PENDING)
        .to(MbaState.EXAM_SECOND_PENDING)
        .on(MbaEvents.FIRST_EXAM)
        .when(ctx -> ctx.getScore() >= 60.0)
        .perform((from, to, e, ctx) -> System.out.println("初试通过"));
    builder
        .externalTransition()
        .from(MbaState.EXAM_FIRST_PENDING)
        .to(MbaState.EXAM_FIRST_FAILED)
        .on(MbaEvents.FIRST_EXAM)
        .when(ctx -> ctx.getScore() < 60.0)
        .perform((from, to, e, ctx) -> System.out.println("初试不通过"));
    builder
        .externalTransition()
        .from(MbaState.EXAM_SECOND_PENDING)
        .to(MbaState.IN_WAITLIST)
        .on(MbaEvents.SECOND_EXAM)
        .when(ctx -> ctx.getScore() >= 80.0)
        .perform((from, to, e, ctx) -> System.out.println("复试通过"));
    builder
        .externalTransition()
        .from(MbaState.EXAM_SECOND_PENDING)
        .to(MbaState.EXAM_SECOND_FAILED)
        .on(MbaEvents.SECOND_EXAM)
        .when(ctx -> ctx.getScore() < 80.0)
        .perform((from, to, e, ctx) -> System.out.println("复试不通过"));

    // 第三步:设置状态机的id和ready,并在StateMachineFactory中的stateMachineMap进行注册
    StateMachine<MbaState, MbaEvents, MbaContext> stateMachine = builder.build(MACHINE_ID);
    // 第四步:触发状态机
    MbaState target = stateMachine.fireEvent(initState, event, context);
    System.out.println(target);
  }
}

enum MbaState {
  EXAM_FIRST_PENDING("待初试"),
  EXAM_FIRST_FAILED("初试不通过"),
  EXAM_SECOND_PENDING("待复试"),
  EXAM_SECOND_FAILED("复试不通过"),
  IN_WAITLIST("待录取"),
  ;

  @Getter private String message;

  MbaState(String message) {
    this.message = message;
  }
}

enum MbaEvents {
  FIRST_EXAM("初试"),
  SECOND_EXAM("复试"),
  FINAL_EXAM("终试"),
  ;

  @Getter private String message;

  MbaEvents(String message) {
    this.message = message;
  }
}

@Data
class MbaContext {
  /** 考试分数 */
  private double score;

  /** 考试结果 */
  private Boolean result;
}

丰木
325 声望21 粉丝

遇见超乎想象的自己!