feat: 状态机支持发布、订阅事件.

This commit is contained in:
2025-01-24 09:43:34 +08:00
parent 54e6f56bc6
commit a1bdb96638
5 changed files with 52 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ import com.serliunx.statemanagement.machine.handler.StateHandlerWrapper;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
/**
* 状态机构建
@@ -38,6 +39,7 @@ public final class StateMachineBuilder<S> {
private final Map<S, List<StateHandlerWrapper<S>>> entryHandlers = new HashMap<>(64);
private final Map<S, List<StateHandlerWrapper<S>>> leaveHandlers = new HashMap<>(64);
private final Map<String, List<StateHandlerWrapper<S>>> exchangeHandlers = new HashMap<>(64);
private final Map<Object, List<Consumer<StateMachine<S>>>> eventRegistries = new HashMap<>(64);
private StateMachineBuilder(List<S> states) {
this.stateList = states;
@@ -169,6 +171,18 @@ public final class StateMachineBuilder<S> {
return whenEntry(state, handler, null);
}
/**
* 注册当前状态机感兴趣的事件
*
* @param event 事件
* @param logic 切换逻辑
*/
public StateMachineBuilder<S> whenHappened(Object event, Consumer<StateMachine<S>> logic) {
List<Consumer<StateMachine<S>>> consumers = eventRegistries.computeIfAbsent(event, k -> new ArrayList<>());
consumers.add(logic);
return this;
}
/**
* 指定状态机的执行器
* <p>
@@ -238,7 +252,7 @@ public final class StateMachineBuilder<S> {
}
if (type.equals(StateMachineType.STANDARD)) {
return (M)new StandardStateMachine<>(stateList, entryHandlers,
leaveHandlers, exchangeHandlers, executor, async);
leaveHandlers, exchangeHandlers, eventRegistries, executor, async);
}
throw new IllegalArgumentException("未知的状态机类型: " + type);
}