stateless4j / stateless4j

 <dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>

Tworzenie stanu

wprowadzenie

twórz maszyny stanowe i lekkie przepływy pracy oparte na maszynach stanowych bezpośrednio w kodzie java.

StateMachineConfig<State, Trigger> phoneCallConfig = new StateMachineConfig<>();phoneCallConfig.configure(State.OffHook) .permit(Trigger.CallDialed, State.Ringing);phoneCallConfig.configure(State.Ringing) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.CallConnected, State.Connected);// this example uses Java 8 method references// a Java 7 example is provided in /examplesphoneCallConfig.configure(State.Connected) .onEntry(this::startCallTimer) .onExit(this::stopCallTimer) .permit(Trigger.LeftMessage, State.OffHook) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PlacedOnHold, State.OnHold);// ...StateMachine<State, Trigger> phoneCall = new StateMachine<>(State.OffHook, phoneCallConfig);phoneCall.fire(Trigger.CallDialed);assertEquals(State.Ringing, phoneCall.getState());

stateless4j jest portem bezstanowym dla Javy

funkcje

większość standardowych konstrukcji maszyn stanowych jest obsługiwana:

  • ogólne wsparcie dla stanów i wyzwalaczy dowolnego typu java (liczby, ciągi znaków, wyliczenia itp.
  • Stany hierarchiczne
  • zdarzenia wejścia/wyjścia dla Stanów
  • klauzule Guard obsługujące przejścia warunkowe
  • akcje zdefiniowane przez Użytkownika mogą być wykonywane podczas przejścia
  • przejścia wewnętrzne (nie wywołanie onExit/onEntry)
  • introspekcja

dostępne są również przydatne rozszerzenia:

  • parametryzowane wyzwalacze
  • Stany Recentracyjne

Stany hierarchiczne

w poniższym przykładzie stan OnHold jest stanem podrzędnym stanu Connected. Oznacza to, że połączenie OnHold jest nadal podłączone.

phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);

oprócz właściwości StateMachine.getState(), która będzie raportować dokładny aktualny stan, dostępna jest metoda isInState(State). isInState(State) weźmie pod uwagę podstaty, więc jeśli powyższy przykład był w stanieOnHold, isInState(State.Connected) również obliczy do true.

zdarzenia wejścia/Wyjścia

w przykładzie metoda startCallTimer() zostanie wykonana, gdy połączenie zostanie połączone. Telefon stopCallTimer() zostanie wyłączony po zakończeniu połączenia (przez powieszenie lub rzucenie telefonem o ścianę.)

wywołanie może poruszać się między Stanami Connected i OnHold bez wielokrotnego wywoływania metod startCallTimer() i stopCallTimer(), ponieważ stan OnHold jest stanem podrzędnym stanu Connected.

obsługa zdarzeń wejścia/Wyjścia może być dostarczona z parametrem typu Transition, który opisuje stan wyzwalacza, źródła i przeznaczenia.

akcja przy przejściu

podczas przejścia można wykonać akcję zdefiniowaną przez użytkownika.W przypadku przejścia „normalnego” lub „ponownego uczestnictwa” działanie to będzie nazywane bez żadnych parametrów. Dla „dynamicznych” przejść (tych, którzy obliczają stan ładunku na podstawie parametrów wyzwalanych) parametry triggera zostaną przekazane akcji.

ta akcja jest wykonywana tylko wtedy, gdy przejście jest rzeczywiście wykonane; więc jeśli przejście jest strzeżone, a strażnik zabrania przejścia, wtedy akcja nie jest wykonywana.

jeśli przejście zostanie wykonane, akcja zostanie wykonana między onExit obsługą stanu bieżącego a onEntry obsługą stanu obecnego (który może być tym samym stanem w przypadku ponownego wejścia.

Licencja

Apache 2.0 Licencja

Created by @ oxo42

utrzymywana przez Chris Narkiewicz @ezaquarii

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.