change: 调整状态机实例化参数.

This commit is contained in:
2025-02-02 17:25:37 +08:00
parent a1bdb96638
commit ad26f59438
3 changed files with 67 additions and 38 deletions

View File

@@ -20,32 +20,7 @@ import java.util.function.Consumer;
*/
public abstract class AbstractStateMachine<S> extends AbstractStateManager<S> implements StateMachine<S> {
/**
* 进入事件集合
*/
protected final Map<S, List<StateHandlerWrapper<S>>> entryHandlers;
/**
* 离开事件集合
*/
protected final Map<S, List<StateHandlerWrapper<S>>> leaveHandlers;
/**
* 交换事件集合
*/
protected final Map<String, List<StateHandlerWrapper<S>>> exchangeHandlers;
/**
* 事件注册集合
*/
protected final Map<Object, List<Consumer<StateMachine<S>>>> eventRegistries;
/**
* 异步执行器
*/
protected final Executor executor;
/**
* 是否异步执行
* <p>
* 当具体的执行器没有指定是否异步时, 将根据该值决定是否异步执行.
*/
protected final Boolean async;
protected final StateMachineContext<S> context;
/**
* 默认的构造函数
@@ -65,16 +40,12 @@ public abstract class AbstractStateMachine<S> extends AbstractStateManager<S> 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<S> extends AbstractStateManager<S> 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<S> extends AbstractStateManager<S> im
return;
final StateHandlerProcessParams<S> 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

View File

@@ -38,7 +38,7 @@ public class StandardStateMachine<S> extends AbstractStateMachine<S> implements
@Override
public void publish(Object event) {
List<Consumer<StateMachine<S>>> consumers = eventRegistries.get(event);
List<Consumer<StateMachine<S>>> consumers = context.eventRegistries.get(event);
if (consumers != null) {
consumers.forEach(consumer -> consumer.accept(this));
}

View File

@@ -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 <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.0
* @since 2025/2/2
*/
public final class StateMachineContext<S> {
/**
* 进入事件集合
*/
final Map<S, List<StateHandlerWrapper<S>>> entryHandlers;
/**
* 离开事件集合
*/
final Map<S, List<StateHandlerWrapper<S>>> leaveHandlers;
/**
* 交换事件集合
*/
final Map<String, List<StateHandlerWrapper<S>>> exchangeHandlers;
/**
* 事件注册集合
*/
final Map<Object, List<Consumer<StateMachine<S>>>> eventRegistries;
/**
* 异步执行器
*/
final Executor executor;
/**
* 是否异步执行
* <p>
* 当具体的执行器没有指定是否异步时, 将根据该值决定是否异步执行.
*/
final Boolean async;
StateMachineContext(Map<S, List<StateHandlerWrapper<S>>> entryHandlers,
Map<S, List<StateHandlerWrapper<S>>> leaveHandlers,
Map<String, List<StateHandlerWrapper<S>>> exchangeHandlers,
Map<Object, List<Consumer<StateMachine<S>>>> eventRegistries,
Executor executor,
Boolean async
) {
this.entryHandlers = entryHandlers;
this.leaveHandlers = leaveHandlers;
this.exchangeHandlers = exchangeHandlers;
this.executor = executor;
this.async = async;
this.eventRegistries = eventRegistries;
}
}