stateless4j / stateless4j

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

stav sestavení

Úvod

vytvářejte stavové stroje a pracovní postupy založené na lehkých stavových strojích přímo v kódu 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 je port bez státní příslušnosti pro Javu

funkce

většina standardních stavových strojů konstrukty jsou podporovány:

  • obecná podpora stavů a spouštěčů libovolného typu java (čísla ,řetězce, enumy atd.
  • hierarchické stavy
  • vstupní / výstupní události pro stavy
  • ochranné klauzule pro podporu podmíněných přechodů
  • uživatelem definované akce mohou být provedeny při přechodu
  • interní přechody (nevyvolávají onExit/onEntry)
  • introspekce

některé užitečné rozšíření jsou také k dispozici:

  • parametrizované spouštěče
  • reentrantní stavy

hierarchické stavy

v níže uvedeném příkladu je stav OnHold substatem stavu Connected. To znamená, že volání OnHold jestále připojeno.

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

kromě vlastnosti StateMachine.getState(), která bude hlásit přesný aktuální stav, je k dispozici metoda isInState(State). isInState(State) bude brát rozvodny v úvahu, takže pokud by výše uvedený příklad byl ve stavuOnHold, isInState(State.Connected) by také vyhodnotil na true.

vstupní/výstupní události

v příkladu bude metoda startCallTimer() provedena při připojení hovoru. stopCallTimer() bude beexecuted po dokončení hovoru (buď zavěšením nebo hodením telefonu proti zdi.)

volání se může pohybovat mezi stavy Connected a OnHold, aniž by byly opakovaně volány metody startCallTimer() a stopCallTimer(), protože stav OnHold je substate stavu Connected.

obsluha vstupních / výstupních událostí může být dodávána s parametrem typu Transition, který popisuje spouštěcí, zdrojové a cílové stavy.

akce na přechodu

při provádění přechodu je možné provést uživatelem definovanou akci.Pro „normální“ nebo „opětovný“ přechod bude tato akce volánabez jakýchkoli parametrů. U „dynamických“ přechodů (těch, kteří počítají stav Targetu na základě parametrů daných spouštěčem) budou parametry thetrigger dány akci.

tato akce se provádí pouze tehdy, pokud je přechod skutečně proveden; pokud je tedy přechod hlídán a stráž zakazuje přechod, pak se akce neprovede.

pokud je přechod proveden, bude akce provedena mezi onExit handler aktuálního stavu a onEntry handler stavu target (což může být stejný stav v případě opětovného vstupu.

Licence

Apache 2.0 Licence

vytvořil @oxo42

udržuje Chris Narkiewicz @ezaquarii

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.