+ * 当具体的执行器没有指定是否异步时, 将根据该值决定是否异步执行.
+ */
+ private final Boolean async;
+
+ /**
+ * 默认的构造函数
+ *
+ * @param entryHandlers 进入事件处理器集合
+ * @param leaveHandlers 离开事件处理器集合
+ * @param exchangeHandlers 交换事件处理器集合
+ * @param executor 异步执行器
+ * @param async 是否异步执行
+ */
+ StandardStateMachine(List
+ * 基于双向的状态管理器扩展 {@link BidirectionalStateManager}, 切换逻辑依赖于内置的状态管理器;
+ * 同时可以多种监听事件, 包括:
+ *
+ * 推荐使用{@link StateMachineBuilder} 来构建状态机.
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ * @see StateMachineBuilder
+ * @see BidirectionalStateManager
+ * @see com.serliunx.statemanagement.manager.StateManager
+ */
+public interface StateMachine
+ * 优先级低于添加事件时指定的执行器
+ *
+ * @param executor 执行器
+ */
+ public StateMachineBuilder
+ * 定义状态进入、离开及切换时执行的逻辑
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+@FunctionalInterface
+public interface StateHandler
+ * 用于状态机处理事件
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+@SuppressWarnings("all")
+public final class StateHandlerProcessParams
+ * 用于添加处理器时设置处理器的行为
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+@SuppressWarnings("all")
+public final class StateHandlerWrapper
+ * 提供了最基本功能的实现以及部分供子类使用的参数,如:锁、当前状态的序号等.
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public abstract class AbstractStateManager 请保证仅在有写锁的情况下去修改
+ */
+ private volatile int index;
+
+ /**
+ * 锁
+ */
+ private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+ /**
+ * 读锁
+ */
+ protected final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
+ /**
+ * 写锁
+ */
+ protected final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
+
+ /**
+ * @param stateList 状态列表
+ */
+ public AbstractStateManager(List
+ * 类及子类访问当前状态时不允许使用{@link #current()},因为会造成死锁
+ *
+ *
+ * 基于单向流转的状态管理器{@link UnidirectionalStateManager} 实现, 在其基础上允许了反方向切换状态
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public interface BidirectionalStateManager
+ * 将状态集合按照一定的逻辑流转
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public interface StateManager
+ * 其基本逻辑等同于 {@link StateManager}, 但存在以下不同:
+ *
+ *
+ *
+ * 即状态的切换只允许一个方向,不允许向前流动,除非到达最后一个状态!
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public interface UnidirectionalStateManager stateList,
+ Map>> entryHandlers,
+ Map>> leaveHandlers,
+ Map stateHandler;
+ if (hw == null ||
+ (stateHandler = hw.getStateHandler()) == null) {
+ return;
+ }
+
+ final Executor executorToRun = hw.getExecutor() == null ? executor : hw.getExecutor();
+ final boolean runInAsync = hw.getAsync() == null ? isGlobalAsync : hw.getAsync();
+ final StateHandlerProcessParams params = new StateHandlerProcessParams<>(from, to, null);
+
+ if (runInAsync) {
+ if (executorToRun == null) {
+ throw new NullPointerException();
+ }
+ executorToRun.execute(() -> stateHandler.handle(params));
+ } else {
+ stateHandler.handle(params);
+ }
+ });
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/StateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/StateMachine.java
new file mode 100644
index 0000000..471ba41
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/StateMachine.java
@@ -0,0 +1,26 @@
+package com.serliunx.statemanagement.machine;
+
+import com.serliunx.statemanagement.manager.BidirectionalStateManager;
+
+/**
+ * 状态机定义
+ * extends BidirectionalStateManager {
+
+
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/StateMachineBuilder.java b/src/main/java/com/serliunx/statemanagement/machine/StateMachineBuilder.java
new file mode 100644
index 0000000..9328444
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/StateMachineBuilder.java
@@ -0,0 +1,227 @@
+package com.serliunx.statemanagement.machine;
+
+import com.serliunx.statemanagement.machine.handler.StateHandler;
+import com.serliunx.statemanagement.machine.handler.StateHandlerWrapper;
+import com.serliunx.statemanagement.manager.BidirectionalStateManager;
+
+import java.util.*;
+import java.util.concurrent.Executor;
+
+/**
+ * 状态机构建
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public final class StateMachineBuilder {
+
+ /**
+ * 状态管理器
+ */
+ private List stateList;
+ /**
+ * 执行器
+ */
+ private Executor executor;
+ /**
+ * 是否异步执行
+ */
+ private Boolean async;
+
+ /**
+ * 各种事件
+ */
+ private final Map>> entryHandlers = new HashMap<>(64);
+ private final Map>> leaveHandlers = new HashMap<>(64);
+ private final Map exchange(S from, S to, StateHandler handler, Boolean async, Executor executor) {
+ final String key = from.toString() + "-" + to.toString();
+ final List exchange(S from, S to, StateHandler handler, Boolean async) {
+ return exchange(from, to, handler, async, null);
+ }
+
+ /**
+ * 添加交换事件
+ * exchange(S from, S to, StateHandler handler) {
+ return exchange(from, to, handler, null);
+ }
+
+ /**
+ * 添加离开事件
+ * whenLeave(S state, StateHandler handler, Boolean async, Executor executor) {
+ final List whenLeave(S state, StateHandler handler, Boolean async) {
+ return whenLeave(state, handler, async, null);
+ }
+
+ /**
+ * 添加离开事件
+ * whenLeave(S state, StateHandler handler) {
+ return whenLeave(state, handler, null);
+ }
+
+ /**
+ * 添加进入事件
+ * whenEntry(S state, StateHandler handler, Boolean async, Executor executor) {
+ final List whenEntry(S state, StateHandler handler, Boolean async) {
+ return whenEntry(state, handler, async, null);
+ }
+
+ /**
+ * 添加进入事件
+ * whenEntry(S state, StateHandler handler) {
+ return whenEntry(state, handler, null);
+ }
+
+ /**
+ * 指定状态机的执行器
+ * executor(Executor executor) {
+ this.executor = executor;
+ return this;
+ }
+
+ /**
+ * 定义状态机是否异步执行
+ *
+ * @param async 是否异步执行
+ */
+ public StateMachineBuilder async(Boolean async) {
+ this.async = async;
+ return this;
+ }
+
+ /**
+ * 定义状态机为异步执行
+ */
+ public StateMachineBuilder async() {
+ return async(true);
+ }
+
+ /**
+ * 设置状态列表
+ */
+ public StateMachineBuilder states(S[] states) {
+ return states(Arrays.asList(states));
+ }
+
+ /**
+ * 设置状态列表
+ */
+ public StateMachineBuilder states(List states) {
+ stateList = states;
+ return this;
+ }
+
+ /**
+ * 构建
+ */
+ @SuppressWarnings("unchecked")
+ public 状态类参数
+ */
+ @SuppressWarnings("all")
+ public static StateMachineBuilder from(Class extends S> stateClass) {
+ return new StateMachineBuilder<>();
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandler.java b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandler.java
new file mode 100644
index 0000000..b5a3278
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandler.java
@@ -0,0 +1,21 @@
+package com.serliunx.statemanagement.machine.handler;
+
+/**
+ * 状态处理器
+ * {
+
+ /**
+ * 处理
+ *
+ * @param params 参数
+ */
+ void handle(StateHandlerProcessParams params);
+}
\ No newline at end of file
diff --git a/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerProcessParams.java b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerProcessParams.java
new file mode 100644
index 0000000..f3e8677
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerProcessParams.java
@@ -0,0 +1,53 @@
+package com.serliunx.statemanagement.machine.handler;
+
+import com.serliunx.statemanagement.manager.BidirectionalStateManager;
+
+/**
+ * 状态处理器入参
+ * {
+
+ /**
+ * 源状态
+ */
+ private final S from;
+ /**
+ * 目标状态
+ */
+ private final S to;
+ /**
+ * 附加参数
+ */
+ private final Object attach;
+
+ /**
+ * @param from 原状态
+ * @param to 目标状态
+ * @param attach 附加参数
+ * @param bidirectionalStateManager 状态机内置的状态管理器
+ */
+ public StateHandlerProcessParams(S from, S to, Object attach) {
+ this.from = from;
+ this.to = to;
+ this.attach = attach;
+ }
+
+ public S getFrom() {
+ return from;
+ }
+
+ public S getTo() {
+ return to;
+ }
+
+ public Object getAttach() {
+ return attach;
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerRegistry.java b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerRegistry.java
new file mode 100644
index 0000000..6485f07
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerRegistry.java
@@ -0,0 +1,10 @@
+package com.serliunx.statemanagement.machine.handler;
+
+/**
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public class StateHandlerRegistry {
+
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerWrapper.java b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerWrapper.java
new file mode 100644
index 0000000..58c26f1
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/handler/StateHandlerWrapper.java
@@ -0,0 +1,53 @@
+package com.serliunx.statemanagement.machine.handler;
+
+import java.util.concurrent.Executor;
+
+/**
+ * 处理器封装
+ * {
+
+ /**
+ * 状态处理器
+ */
+ private final StateHandler stateHandler;
+ /**
+ * 执行器
+ * stateHandler, Executor executor, Boolean async) {
+ this.stateHandler = stateHandler;
+ this.executor = executor;
+ this.async = async;
+ }
+
+ public StateHandler getStateHandler() {
+ return stateHandler;
+ }
+
+ public Executor getExecutor() {
+ return executor;
+ }
+
+ public Boolean getAsync() {
+ return async;
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java
new file mode 100644
index 0000000..c398981
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java
@@ -0,0 +1,184 @@
+package com.serliunx.statemanagement.manager;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * 状态管理器的抽象实现
+ * implements StateManager {
+
+ /**
+ * 状态列表
+ */
+ private final List stateList;
+
+ /**
+ * 当前状态的序号
+ * stateList) {
+ this.stateList = stateList;
+ index = 0;
+ }
+
+ /**
+ * @param states 状态数组
+ */
+ public AbstractStateManager(S[] states) {
+ this(Arrays.asList(states));
+ }
+
+ /**
+ * 保留空构造器
+ */
+ public AbstractStateManager() {
+ this((List) null);
+ }
+
+ @Override
+ public S current() {
+ try {
+ readLock.lock();
+ return get();
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean switchTo(S state) {
+ int i = indexOf(state);
+ if (i == -1) {
+ return false;
+ }
+ try {
+ writeLock.lock();
+ index = i;
+ } finally {
+ writeLock.unlock();
+ }
+ return true;
+ }
+
+ @Override
+ public void reset() {
+ try {
+ writeLock.lock();
+ index = getDefault();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ /**
+ * 将序号移动至下一个
+ * extends UnidirectionalStateManager {
+
+ /**
+ * 切换至上一个状态并返回切换后的状态
+ *
+ * @return 切换后的状态
+ */
+ S switchPrevAndGet();
+
+ /**
+ * 获取当前状态并切换至上一个状态
+ *
+ * @return 切换前的状态
+ */
+ S getAndSwitchPrev();
+
+ /**
+ * 切换至上一个状态
+ */
+ void switchPrev();
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/DefaultBidirectionalStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/DefaultBidirectionalStateManager.java
new file mode 100644
index 0000000..b288725
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/DefaultBidirectionalStateManager.java
@@ -0,0 +1,66 @@
+package com.serliunx.statemanagement.manager;
+
+import java.util.List;
+
+/**
+ * 双向流转的状态管理器的默认实现
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public class DefaultBidirectionalStateManager extends DefaultUnidirectionalStateManager
+ implements BidirectionalStateManager {
+
+ /**
+ * @param stateList 状态列表
+ */
+ public DefaultBidirectionalStateManager(List stateList) {
+ super(stateList);
+ }
+
+ /**
+ * @param states 状态数组
+ */
+ public DefaultBidirectionalStateManager(S[] states) {
+ super(states);
+ }
+
+ @Override
+ public S switchPrevAndGet() {
+ try {
+ writeLock.lock();
+ prev();
+ return get();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public S getAndSwitchPrev() {
+ try {
+ writeLock.lock();
+ S current = get();
+ prev();
+ return current;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public void switchPrev() {
+ try {
+ writeLock.lock();
+ prev();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean switchTo(S state) {
+ return defaultSwitchTo(state);
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/DefaultUnidirectionalStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/DefaultUnidirectionalStateManager.java
new file mode 100644
index 0000000..c93bf0d
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/DefaultUnidirectionalStateManager.java
@@ -0,0 +1,85 @@
+package com.serliunx.statemanagement.manager;
+
+import java.util.List;
+
+/**
+ * 单向流转的状态管理器的默认实现
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public class DefaultUnidirectionalStateManager extends AbstractStateManager
+ implements UnidirectionalStateManager {
+
+ /**
+ * @param stateList 状态列表
+ */
+ public DefaultUnidirectionalStateManager(List stateList) {
+ super(stateList);
+ }
+
+ /**
+ * @param states 状态数组
+ */
+ public DefaultUnidirectionalStateManager(S[] states) {
+ super(states);
+ }
+
+ @Override
+ public S switchNextAndGet() {
+ try {
+ writeLock.lock();
+ next();
+ return get();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public S getAndSwitchNext() {
+ try {
+ writeLock.lock();
+ S current = get();
+ next();
+ return current;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public void switchNext() {
+ try {
+ writeLock.lock();
+ next();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean switchTo(S state) {
+ try {
+ writeLock.lock();
+ final int i;
+ if ((i = indexOf(state)) == -1 ||
+ (!isLast() && i < currentIndex()) ||
+ (isLast() && i != getDefault())) {
+ return false;
+ }
+ updateCurrentIndex(i);
+ } finally {
+ writeLock.unlock();
+ }
+ return true;
+ }
+
+ /**
+ * 保留默认的切换方式供子类使用
+ */
+ protected boolean defaultSwitchTo(S state) {
+ return super.switchTo(state);
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/StandardStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/StandardStateManager.java
new file mode 100644
index 0000000..0e1c2b1
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/StandardStateManager.java
@@ -0,0 +1,27 @@
+package com.serliunx.statemanagement.manager;
+
+import java.util.List;
+
+/**
+ * 最简单的状态管理器实现
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public final class StandardStateManager extends AbstractStateManager {
+
+ /**
+ * @param stateList 状态列表
+ */
+ public StandardStateManager(List stateList) {
+ super(stateList);
+ }
+
+ /**
+ * @param states 状态数组
+ */
+ public StandardStateManager(S[] states) {
+ super(states);
+ }
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/StateManager.java b/src/main/java/com/serliunx/statemanagement/manager/StateManager.java
new file mode 100644
index 0000000..a7109ee
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/StateManager.java
@@ -0,0 +1,35 @@
+package com.serliunx.statemanagement.manager;
+
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * 状态管理器
+ * {
+
+ /**
+ * 获取当前状态
+ *
+ * @return 当前最新状态
+ */
+ S current();
+
+ /**
+ * 切换到指定状态
+ *
+ * @param state 新的状态
+ * @return 切换成功返回真, 否则返回假
+ */
+ boolean switchTo(S state);
+
+ /**
+ * 重置回默认状态, 一般为状态集合中的第一个
+ */
+ void reset();
+}
diff --git a/src/main/java/com/serliunx/statemanagement/manager/UnidirectionalStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/UnidirectionalStateManager.java
new file mode 100644
index 0000000..439345e
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/manager/UnidirectionalStateManager.java
@@ -0,0 +1,40 @@
+package com.serliunx.statemanagement.manager;
+
+/**
+ * 单向流转的状态管理器
+ * extends StateManager {
+
+ /**
+ * 切换至下一个状态并返回切换后的状态
+ *
+ * @return 切换后的状态
+ */
+ S switchNextAndGet();
+
+ /**
+ * 返回并切换至下一个状态
+ *
+ * @return 切换前的状态
+ */
+ S getAndSwitchNext();
+
+ /**
+ * 切换至下一个状态
+ */
+ void switchNext();
+}
diff --git a/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java b/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java
new file mode 100644
index 0000000..02623aa
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/support/ExecutorUtils.java
@@ -0,0 +1,11 @@
+package com.serliunx.statemanagement.support;
+
+/**
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+public final class ExecutorUtils {
+
+ private ExecutorUtils() {throw new UnsupportedOperationException();}
+}
diff --git a/src/test/java/com/serliunx/statemanagement/MachineTest.java b/src/test/java/com/serliunx/statemanagement/MachineTest.java
new file mode 100644
index 0000000..2330450
--- /dev/null
+++ b/src/test/java/com/serliunx/statemanagement/MachineTest.java
@@ -0,0 +1,41 @@
+package com.serliunx.statemanagement;
+
+import com.serliunx.statemanagement.machine.StateMachine;
+import com.serliunx.statemanagement.machine.StateMachineBuilder;
+import com.serliunx.statemanagement.support.PrinterState;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+
+import java.util.concurrent.Executors;
+
+/**
+ * 状态机测试
+ *
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2024/12/28
+ */
+@Slf4j
+public class MachineTest {
+
+ @Test
+ public void testStandardStateMachine() {
+ StateMachine