From 89799257aaffeeb089ac8207cac9b920d2cb2b5b Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Fri, 11 Apr 2025 09:39:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=94=A8=E6=9D=A5=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA=E7=8A=B6=E6=80=81=E6=9C=BA?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../machine/support/StateMachines.java | 94 +++++++++++++++++++ .../statemanagement/StateMachinesTest.java | 34 +++++++ 2 files changed, 128 insertions(+) create mode 100644 src/main/java/com/serliunx/statemanagement/machine/support/StateMachines.java create mode 100644 src/test/java/com/serliunx/statemanagement/StateMachinesTest.java diff --git a/src/main/java/com/serliunx/statemanagement/machine/support/StateMachines.java b/src/main/java/com/serliunx/statemanagement/machine/support/StateMachines.java new file mode 100644 index 0000000..4a7315c --- /dev/null +++ b/src/main/java/com/serliunx/statemanagement/machine/support/StateMachines.java @@ -0,0 +1,94 @@ +package com.serliunx.statemanagement.machine.support; + +import com.serliunx.statemanagement.machine.ConcurrentStateMachine; +import com.serliunx.statemanagement.machine.StateMachine; +import com.serliunx.statemanagement.machine.StateMachineBuilder; + +import java.util.List; + +/** + * 状态机工具类集合 + * + * @author SerLiunx + * @since 2025/4/11 + */ +public final class StateMachines { + + /** + * 获取一个仅包含状态的并发型状态机 + *

+ * 所生成的状态机没有任务事件逻辑,此时仅用作普通的双向状态管理器使用 + *

+ * + * @param states 状态集合 + * + * @return 仅包含状态的并发型状态机 + * @param 状态 + * @see ConcurrentStateMachine + * @see com.serliunx.statemanagement.manager.BidirectionalStateManager + */ + public static ConcurrentStateMachine concurrentStateMachine(S[] states) { + return StateMachineBuilder.from(states) + .async(false) + .concurrent() + .build(); + } + + /** + * 获取一个仅包含状态的并发型状态机 + *

+ * 所生成的状态机没有任务事件逻辑,此时仅用作普通的双向状态管理器使用 + *

+ * + * @param states 状态集合 + * + * @return 仅包含状态的并发型状态机 + * @param 状态 + * @see ConcurrentStateMachine + * @see com.serliunx.statemanagement.manager.BidirectionalStateManager + */ + public static ConcurrentStateMachine concurrentStateMachine(List states) { + return StateMachineBuilder.from(states) + .async(false) + .concurrent() + .build(); + } + + /** + * 获取一个仅包含状态的普通状态机 + *

+ * 所生成的状态机没有任务事件逻辑,此时仅用作普通的双向状态管理器使用 + *

+ * + * @param states 状态集合 + * + * @return 仅包含状态的普通状态机 + * @param 状态 + * @see StateMachine + * @see com.serliunx.statemanagement.manager.BidirectionalStateManager + */ + public static StateMachine defaultStateMachine(S[] states) { + return StateMachineBuilder.from(states) + .async(false) + .build(); + } + + /** + * 获取一个仅包含状态的普通状态机 + *

+ * 所生成的状态机没有任务事件逻辑,此时仅用作普通的双向状态管理器使用 + *

+ * + * @param states 状态集合 + * + * @return 仅包含状态的普通状态机 + * @param 状态 + * @see StateMachine + * @see com.serliunx.statemanagement.manager.BidirectionalStateManager + */ + public static StateMachine defaultStateMachine(List states) { + return StateMachineBuilder.from(states) + .async(false) + .build(); + } +} diff --git a/src/test/java/com/serliunx/statemanagement/StateMachinesTest.java b/src/test/java/com/serliunx/statemanagement/StateMachinesTest.java new file mode 100644 index 0000000..8a194bd --- /dev/null +++ b/src/test/java/com/serliunx/statemanagement/StateMachinesTest.java @@ -0,0 +1,34 @@ +package com.serliunx.statemanagement; + +import com.serliunx.statemanagement.machine.ConcurrentStateMachine; +import com.serliunx.statemanagement.machine.StateMachine; +import com.serliunx.statemanagement.machine.support.StateMachines; +import com.serliunx.statemanagement.support.PrinterState; +import org.junit.Test; + +/** + * 状态机工具类测试 + * + * @author SerLiunx + * @since 2025/4/11 + */ +public class StateMachinesTest { + + @Test + public void testConcurrentStateMachines() throws Exception { + ConcurrentStateMachine machine = StateMachines.concurrentStateMachine(PrinterState.values()); + System.out.println(machine.current()); + System.out.println(machine.switchPrevAndGet()); + System.out.println(machine.current()); + machine.close(); + } + + @Test + public void testStateMachines() throws Exception { + StateMachine machine = StateMachines.defaultStateMachine(PrinterState.values()); + System.out.println(machine.current()); + System.out.println(machine.switchNextAndGet()); + System.out.println(machine.current()); + machine.close(); + } +}