squirrel-foundation有限狀態機學習

什麼是有限狀態機

有限狀態機:是一種用來進行對象行爲建模的工具,其做用主要是描述對象在它的生命週期內所經歷的狀態序列,以及如何響應來自外界的各類事件。在計算機科學中,有限狀態機被普遍用於建模應用行爲、硬件電路系統設計、軟件工程,編譯器、網絡協議、和計算與語言的研究java

本文主要學習java的一個開源實現 squirrel-foundation 狀態機git

狀態機的要素

1
現態、條件、動做、次態。「現態」和「條件」是因,「動做」和「次態」是果

爲何使用狀態機

通常來講,隨着項目的發展,代碼變得愈來愈複雜,狀態之間的關係,轉化變得愈來愈複雜,好比訂單系統狀態,活動系統狀態等。產品或者開發很難有一我的可以梳理清楚整個狀態的全局. 使用狀態機來管理對象生命週期能夠使得代碼具備更好的可讀性,可維護性,以及可測試性。github

1
有限狀態機是一種對象行爲建模工具,適用對象有一個明確而且複雜的生命流(通常而言三個以上狀態),而且在狀態變遷存在不一樣的觸發條件以及處理行爲。

 

先來看squirrel-foundation github 上面給出的例子,對狀態機有一個直觀的認識網絡



demo

添加maven 依賴maven

1
2
3
4
5
6
<!-- 狀態機-->
<dependency>
    <groupId>org.squirrelframework</groupId>
    <artifactId>squirrel-foundation</artifactId>
    <version>0.3.8</version>
</dependency>

 

QuickStartSample demo工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
import org.squirrelframework.foundation.fsm.UntypedStateMachine;
import org.squirrelframework.foundation.fsm.UntypedStateMachineBuilder;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;

/**
 * @Author wtx
 * @Date 2019/5/5
 */
public class QuickStartSample {
    // 1. Define State Machine Event
    enum FSMEvent {
        ToA, ToB, ToC, ToD
    }

    // 2. Define State Machine Class
    @StateMachineParameters(stateType=String.class, eventType=FSMEvent.class, contextType=Integer.class)
    static class StateMachineSample extends AbstractUntypedStateMachine {
        protected void fromAToB(String from, String to, FSMEvent event, Integer context) {
            System.out.println("Transition from '"+from+"' to '"+to+"' on event '"+event+
                    "' with context '"+context+"'.");
        }

        protected void ontoB(String from, String to, FSMEvent event, Integer context) {
            System.out.println("Entry State \'"+to+"\'.");
        }
    }

    public static void main(String[] args) {
        // 3. Build State Transitions
        UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(StateMachineSample.class);
        builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).callMethod("fromAToB");
        builder.onEntry("B").callMethod("ontoB");

        // 4. Use State Machine
        UntypedStateMachine fsm = builder.newStateMachine("A");
        fsm.fire(FSMEvent.ToB, 10);

        System.out.println("Current state is "+fsm.getCurre5ntState());
    }
}

 

定義StateMachineBuilderFactory

首先使用StateMachineBuilderFactory構造一個UntypedStateMachineBuilder,而後builder.externalTransition(),builder除了externalTransition還有internalTransition(),學習

.from(「A」).to(「B」).on(FSMEvent.ToB).callMethod(「fromAToB」);
當狀態在A 發生 ToB 事件時,調用 方法fromAToB,而後狀態轉化到 B。
builder.onEntry(「B」).callMethod(「ontoB」);
當狀態轉移到B 時,調用方法ontoB。測試

構造UntypedStateMachine fsm

1
2
3
UntypedStateMachine fsm = builder.newStateMachine("A");
// 觸發ToB事件
fsm.fire(FSMEvent.ToB, 10);

獲取當前狀態

1
fsm.getCurrentState()
相關文章
相關標籤/搜索