diff --git a/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java index eeca464..81bc86c 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java +++ b/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java @@ -20,32 +20,7 @@ import java.util.function.Consumer; */ public abstract class AbstractStateMachine extends AbstractStateManager implements StateMachine { - /** - * 进入事件集合 - */ - protected final Map>> entryHandlers; - /** - * 离开事件集合 - */ - protected final Map>> leaveHandlers; - /** - * 交换事件集合 - */ - protected final Map>> exchangeHandlers; - /** - * 事件注册集合 - */ - protected final Map>>> eventRegistries; - /** - * 异步执行器 - */ - protected final Executor executor; - /** - * 是否异步执行 - *

- * 当具体的执行器没有指定是否异步时, 将根据该值决定是否异步执行. - */ - protected final Boolean async; + protected final StateMachineContext context; /** * 默认的构造函数 @@ -65,16 +40,12 @@ public abstract class AbstractStateMachine extends AbstractStateManager im Boolean async ) { super(stateList); - this.entryHandlers = entryHandlers; - this.leaveHandlers = leaveHandlers; - this.exchangeHandlers = exchangeHandlers; - this.executor = executor; - this.async = async; - this.eventRegistries = eventRegistries; + context = new StateMachineContext<>(entryHandlers, leaveHandlers, exchangeHandlers, eventRegistries, executor, async); } @Override public void close() throws Exception { + final Executor executor = context.executor; if (executor == null) { return; } @@ -262,14 +233,14 @@ public abstract class AbstractStateMachine extends AbstractStateManager im */ protected final void invokeHandlers(S from, S to) { // 触发离开处理器 - doInvokeHandlers(leaveHandlers.get(from), from, to); + doInvokeHandlers(context.leaveHandlers.get(from), from, to); // 触发进入处理器 - doInvokeHandlers(entryHandlers.get(to), from, to); + doInvokeHandlers(context.entryHandlers.get(to), from, to); // 触发交换处理器 final String key = from.toString() + "-" + to.toString(); - doInvokeHandlers(exchangeHandlers.get(key), from, to); + doInvokeHandlers(context.exchangeHandlers.get(key), from, to); } /** @@ -285,11 +256,11 @@ public abstract class AbstractStateMachine extends AbstractStateManager im return; final StateHandlerProcessParams params = new StateHandlerProcessParams<>(from, to, null); if (hw.getAsync() == null ? - (this.async != null && this.async) : + (context.async != null && context.async) : hw.getAsync()) { final Executor executor; if ((executor = hw.getExecutor() == null ? - this.executor : hw.getExecutor()) == null) + context.executor : hw.getExecutor()) == null) throw new NullPointerException(); executor.execute(() -> stateHandler.handle(params)); } else diff --git a/src/main/java/com/serliunx/statemanagement/machine/StandardStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/StandardStateMachine.java index f3bd761..213d9e1 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/StandardStateMachine.java +++ b/src/main/java/com/serliunx/statemanagement/machine/StandardStateMachine.java @@ -38,7 +38,7 @@ public class StandardStateMachine extends AbstractStateMachine implements @Override public void publish(Object event) { - List>> consumers = eventRegistries.get(event); + List>> consumers = context.eventRegistries.get(event); if (consumers != null) { consumers.forEach(consumer -> consumer.accept(this)); } diff --git a/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java b/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java new file mode 100644 index 0000000..6d38cd4 --- /dev/null +++ b/src/main/java/com/serliunx/statemanagement/machine/StateMachineContext.java @@ -0,0 +1,58 @@ +package com.serliunx.statemanagement.machine; + +import com.serliunx.statemanagement.machine.handler.StateHandlerWrapper; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.function.Consumer; + +/** + * @author SerLiunx + * @version 1.0.0 + * @since 2025/2/2 + */ +public final class StateMachineContext { + + /** + * 进入事件集合 + */ + final Map>> entryHandlers; + /** + * 离开事件集合 + */ + final Map>> leaveHandlers; + /** + * 交换事件集合 + */ + final Map>> exchangeHandlers; + /** + * 事件注册集合 + */ + final Map>>> eventRegistries; + /** + * 异步执行器 + */ + final Executor executor; + /** + * 是否异步执行 + *

+ * 当具体的执行器没有指定是否异步时, 将根据该值决定是否异步执行. + */ + final Boolean async; + + StateMachineContext(Map>> entryHandlers, + Map>> leaveHandlers, + Map>> exchangeHandlers, + Map>>> eventRegistries, + Executor executor, + Boolean async + ) { + this.entryHandlers = entryHandlers; + this.leaveHandlers = leaveHandlers; + this.exchangeHandlers = exchangeHandlers; + this.executor = executor; + this.async = async; + this.eventRegistries = eventRegistries; + } +}