状态机+应用架构设计
本文最后更新于 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());
* // 比如:发个短信通知用户“您已支付成功”
* }
* }
*/
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 MateHecho