From 1e9113666bf77fdc19a6b74ecf32e9cf969c2b74 Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Wed, 23 Apr 2025 11:30:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8A=B6=E6=80=81=E6=9C=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=B0=E5=A2=9E=E5=B0=91=E9=87=8F=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E7=BB=84=E5=90=88=E7=9B=B8=E5=85=B3=E7=9A=84=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=96=B9=E6=B3=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/AbstractStateManager.java | 5 --- .../statemanagement/manager/StateManager.java | 32 ++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java index 9dc273d..b825829 100644 --- a/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java +++ b/src/main/java/com/serliunx/statemanagement/manager/AbstractStateManager.java @@ -110,11 +110,6 @@ public abstract class AbstractStateManager implements StateManager { return stateList.size(); } - @Override - public boolean isSwitchable() { - return stateList.size() > 1; - } - /** * 将序号移动至下一个 *
  • 自动归零 diff --git a/src/main/java/com/serliunx/statemanagement/manager/StateManager.java b/src/main/java/com/serliunx/statemanagement/manager/StateManager.java index bea9940..1285b66 100644 --- a/src/main/java/com/serliunx/statemanagement/manager/StateManager.java +++ b/src/main/java/com/serliunx/statemanagement/manager/StateManager.java @@ -40,10 +40,40 @@ public interface StateManager { /** * 是否可切换 + *

    + * 默认情况下, 状态集合中的状态数量大于1时就可以切换。部分实现在特定情况下可能不允许切换, + * 比如断路的单向状态管理器 {@link BreakageUnidirectionalStateManager}, 当状态为最后一个时 + * 则不允许向前、或者向后切换 + *

    * * @return 可切换返回真, 否则返回假 */ default boolean isSwitchable() { - return true; + return size() > 1; + } + + /** + * 校验当前状态是否为指定的状态 + * + * @param state 指定的状态 + * @return 符合返回真, 否则返回假 + */ + default boolean now(S state) { + return current().equals(state); + } + + /** + * 如果是指定的状态则切换到另一个状态 + *
  • 例: 检测当前状态是否为 1 且可切换, 如何为 1 则将状态切换到 2 + *
  • 结合了 {@link #current()}、 {@link #switchTo(Object)} 及 {@link #isSwitchable()} + * + * @param now 当前状态 + * @param newState 新的状态 + * @return 如果当前状态不符合或者不可切换则返回假, 否则走切换逻辑, 此时结果取决于切换的结果. + */ + default boolean switchToIfPresent(S now, S newState) { + if (isSwitchable() || now.equals(current())) + return switchTo(newState); + return false; } }