Java的型別化狀態機

banq發表於2024-03-02


作者:不喜歡基於事件的狀態機實現,因此我建立了一個型別化、函式式、簡單且直接的狀態機庫。點選標題

安裝:

<dependency>
    <groupId>com.tsm4j</groupId>
    <artifactId>tsm4j</artifactId>
    <version>0.0.3</version>
</dependency>


public class Demo {
    public void demo() {
        // 建立一個狀態機生成器,輸入為整數,輸出為字串,命名為 demo
        StateMachineBuilder<Integer, String> builder = StateMachineBuilder.create("demo");

        // 定義狀態
        // s1 具有整數輸入,名稱為 "int 1"
        State<Integer> s1 = builder.newTransitionState("int 1");
        // s2 具有名為 "int 2 "的整數輸入值
        State<Integer> s2 = builder.newTransitionState("int 2");
        //s3 的字串輸入名為 "str"。
        // 它是一個輸出狀態,因此到達該狀態的任何值都被視為輸出值
        State<String> s3 = builder.newOutputState("str");

        // 定義轉換
        // state1 ----> state2 ----> state3 (轉為字串)
        builder.addTransition(s1, i -> s2.of(i * 2));
        builder.addTransition(s2, i -> {
            if (i > 5) {
                return s3.of(String.valueOf(i + 1));
            } else {
                return s3.of(String.valueOf(i * 3));
            }
        });

        StateMachine<Integer, String> stateMachine = builder.build();

        //從狀態 1 觸發狀態機
        assertEquals("6", stateMachine.run(s1.of(1)).getOutputs().get(0));  // 1 * 2 * 3 = 6

        //從狀態 1 觸發狀態機
        assertEquals("7", stateMachine.run(s2.of(6)).getOutputs().get(0));  // 6 + 1 = 7
    }
}

相關文章