Endliche Zustandsmaschine in Java

Sheeraz Gul 12 Oktober 2023
Endliche Zustandsmaschine in Java

Die Finite State Machine wird verwendet, um Muster zu erkennen. Dieses Tutorial zeigt, wie Sie einen endlichen Zustandsautomaten in Java implementieren.

Endliche Zustandsmaschine in Java

Die endliche Zustandsmaschine, auch bekannt als endliche Automatenmaschine, nimmt die Symbolkette als Eingabe und ändert dann ihren Zustand entsprechend. Der Übergang erfolgt, wenn das gewünschte Symbol in der Eingabe gefunden wird, und während des Übergangs können die Automaten im selben Zustand bleiben oder in den nächsten Zustand wechseln.

Führen Sie die folgenden Schritte aus, um eine endliche Zustandsmaschine in Java zu implementieren.

  • Erstellen Sie zunächst eine Wrapper-Klasse, um den endlichen Zustandsautomaten zu modellieren.

    Diese Wrapper-Klasse enthält das Array konkreter Zustandsobjekte, den Index zu ihrem aktuellen Zustand und die Zustandsübergangstabelle.

  • Als nächstes werden alle Client-Anfragen an das aktuelle Statusobjekt delegiert.
  • Erstellen Sie dann eine Zustandsbasisklasse, um die konkreten Zustände austauschbar zu machen.

    Diese Zustandsbasisklasse gibt das Standardverhalten aller Zustände an.

  • Schließlich überschreibt die vom Zustand abgeleitete Klasse nur die erforderlichen Nachrichten.

Lassen Sie uns basierend auf den obigen Schritten einen endlichen Zustandsautomaten in Java implementieren.

package delftstack;

// Step 1. create a wrapper class which models the finite state machine.
class Java_FSM {
  // Step 2. wrapper class states
  private FSM_State[] FSM_States = {new State1(), new State2(), new State3()};
  // Step 4. wrapper class transitions
  private int[][] FSM_Transition = {{0, 1, 2}, {2, 2, 0}, {1, 0, 2}};
  // Step 3. wrapper class current state
  private int Current_State = 0;

  private void FSM_Next(int Message) {
    Current_State = FSM_Transition[Current_State][Message];
  }

  // Step 5. all client requests will be delegated to the current state object.
  public void FSM_ON() {
    FSM_States[Current_State].FSM_ON();
    FSM_Next(0);
  }

  public void FSM_OFF() {
    FSM_States[Current_State].FSM_OFF();
    FSM_Next(1);
  }

  public void FSM_ACK() {
    FSM_States[Current_State].FSM_ACK();
    FSM_Next(2);
  }
}

// Step 6. Create a state base class to make the concrete states interchangeable.
// Step 7. state base class will specify the default behavior of all states
abstract class FSM_State {
  public void FSM_ON() {
    System.out.println("An error occurred");
  }

  public void FSM_OFF() {
    System.out.println("An error occurred");
  }

  public void FSM_ACK() {
    System.out.println("An error occurred");
  }
}

class State1 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State1 + ON  = State3");
  }

  public void FSM_OFF() {
    System.out.println("State1 + OFF = State2");
  }

  public void FSM_ACK() {
    System.out.println("State1 + Ack = State1");
  }
}

class State2 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State2 + ON  = State1");
  }

  public void FSM_OFF() {
    System.out.println("State2 + OFF = State3");
  }
}

class State3 extends FSM_State {
  // Step 8. state derived class will only override the messages it require to
  public void FSM_ON() {
    System.out.println("State3 + ON  = State2");
  }
}

public class Finite_State_Machine {
  public static void main(String[] args) {
    Java_FSM JavaFSM = new Java_FSM();
    int[] Messages = {1, 1, 2, 2, 0, 0, 1, 2};
    for (int Message : Messages) {
      if (Message == 0) {
        JavaFSM.FSM_ON();
      } else if (Message == 1) {
        JavaFSM.FSM_OFF();
      } else if (Message == 2) {
        JavaFSM.FSM_ACK();
      }
    }
  }
}

Der obige Code zeigt einen endlichen Zustandsautomaten, der Zustände basierend auf den Eingabenachrichten ändert. Siehe Ausgabe:

State1 + OFF = State2
State2 + OFF = State3
An error occurred
An error occurred
State3 + ON  = State2
State2 + ON  = State1
An error occurred
State1 + Ack = State1
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook