本文最后更新于 2025-03-25,文章超过7天没更新,应该是已完结了~

  • 状态机(AbstractStateMachine):大管家,负责协调。

  • StatusDefine:定义状态身份证。

  • StatusChangeEvent:发出指令,告诉“状态1”(StatusDefine)要变成“状态2”(StatusDefine)。

  • StatusChangeHandler:接到指令,干活更新数据。

  • StateMachineSnapshot:记录干完活后的结果。

/**
 * “状态身份证”,告诉你某个状态的名字、编号和描述
 * @author itcast
 */
public interface StatusDefine {

    /**
     * @return 返回状态编号
     */
    Integer getStatus();

    /**
     * @return 返回状态描述
     */
    String getDesc();

    /**
     * @return 返回状态代码
     */
    String getCode();
}
/**
 * public enum OrderStatus implements StatusDefine {
 *     PENDING(1, "待支付", "PENDING"),    // 待支付
 *     PAID(2, "已支付", "PAID"),          // 已支付
 *     SHIPPED(3, "已发货", "SHIPPED"),    // 已发货
 *     COMPLETED(4, "已完成", "COMPLETED"); // 已完成
 *
 *     private final Integer status;
 *     private final String desc;
 *     private final String code;
 *
 *     OrderStatus(Integer status, String desc, String code) {
 *         this.status = status;
 *         this.desc = desc;
 *         this.code = code;
 *     }
 *
 *     @Override public Integer getStatus() { return status; }
 *     @Override public String getDesc() { return desc; }
 *     @Override public String getCode() { return code; }
 * }
 */
/**
 * “指令单”,告诉你从哪个状态变到哪个状态。
 *状态和事件都写死了,不会出现“随便跳状态”的混乱情况。比如不能从“待支付”直接到“已完成”,必须一步步来
 * @author itcast
 */

public interface StatusChangeEvent {

    /**
     * 原始状态
     */
    StatusDefine getSourceStatus();

    /**
     * 变更后的状态
     */
    StatusDefine getTargetStatus();

    /**
     * @return 返回事件描述
     */
    String getDesc();

    /**
     * @return 返回事件代码
     */
    String getCode();
}

/**
 * public enum OrderEvent implements StatusChangeEvent {
 *     PAY(OrderStatus.PENDING, OrderStatus.PAID, "支付订单", "PAY"), // 从这个“指令单”告诉状态机:如果现在是“待支付”,收到“PAY”事件,就变成“已支付”
 *     SHIP(OrderStatus.PAID, OrderStatus.SHIPPED, "发货", "SHIP"),
 *     COMPLETE(OrderStatus.SHIPPED, OrderStatus.COMPLETED, "完成订单", "COMPLETE");
 *
 *     private final StatusDefine sourceStatus;
 *     private final StatusDefine targetStatus;
 *     private final String desc;
 *     private final String code;
 *
 *     OrderEvent(StatusDefine sourceStatus, StatusDefine targetStatus, String desc, String code) {
 *         this.sourceStatus = sourceStatus;
 *         this.targetStatus = targetStatus;
 *         this.desc = desc;
 *         this.code = code;
 *     }
 *
 *     @Override public StatusDefine getSourceStatus() { return sourceStatus; }
 *     @Override public StatusDefine getTargetStatus() { return targetStatus; }
 *     @Override public String getDesc() { return desc; }
 *     @Override public String getCode() { return code; }
 * }
 */
/**
 * @description 状态快照基础类
 * StateMachineSnapshot就像一张空白的“照片模板”,告诉你照片里必须有哪些基本信息(比如ID和状态),但具体拍什么内容,它不管,得你自己去填
 * 它就像一张“照片”,记录状态机在某个时刻的样子。比如订单支付后,拍张照记下订单号和当前状态,留个纪念。
 * 作用:保存状态机的历史数据,方便回溯或调试
 */
public abstract class StateMachineSnapshot {

    /**
     * 返回快照id
     * @return
     */
    public abstract String getSnapshotId();
    /**
     * 返回快照状态
     * @return
     */
    public abstract Integer getSnapshotStatus();
    /**
     * 设置快照id
     */
    public abstract void setSnapshotId(String snapshotId);
    /**
     * 设置快照状态
     */
    public abstract void setSnapshotStatus(Integer snapshotStatus);
}
/**
 * @Data
 * public class OrderSnapshot extends StateMachineSnapshot {
 *     private String snapshotId;      // 订单号,比如“order123”
 *     private Integer snapshotStatus; // 状态编号,比如 1 是“待支付”
 *     private String orderAmount;     // 额外数据,比如订单金额
 *
 *     @Override public String getSnapshotId() { return snapshotId; }
 *     @Override public Integer getSnapshotStatus() { return snapshotStatus; }
 *     @Override public void setSnapshotId(String snapshotId) { this.snapshotId = snapshotId; }
 *     @Override public void setSnapshotStatus(Integer snapshotStatus) { this.snapshotStatus = snapshotStatus; }
 *     除了必须实现的4个抽象方法,它可以扩展,比如加orderAmount,满足订单的特殊需求
 * }
 */
/**
 * 状态变化处理器
 * 说明:
 * 1、功能说明:状态变更时执行的业务逻辑
 * 2、接口实现类的bean名称规则为:状态机名称_状态变更事件名称
 * 状态机里,状态要变的时候(比如从“待支付”变成“已支付”),
 * 光知道变还不够,得有人去干具体的活,比如更新订单金额、发短信通知用户。这个“干活的小工”就是StatusChangeHandler
 * @author itcast
 */
public interface StatusChangeHandler<T extends StateMachineSnapshot> {

    /**
     * 状态变化处理逻辑
     *
     * @param bizId 业务id
     * @param statusChangeEventEnum 状态变更事件
     * @param bizSnapshot 快照
     */
    void handler(String bizId,StatusChangeEvent statusChangeEventEnum,T bizSnapshot);
}
/**
 * @Component("order_PAY")
 * public class PayHandler implements StatusChangeHandler<OrderSnapshot> {  //指定OrderSnapshot来干活
 *     @Override
 *     public void handler(String bizId, StatusChangeEvent event, OrderSnapshot snapshot) {
 *         snapshot.setOrderAmount("100.00"); // 记录支付金额
 *         System.out.println("订单 " + bizId + " 已支付,金额:" + snapshot.getOrderAmount());
 *         // 比如:发个短信通知用户“您已支付成功”
 *     }
 * }
 */