Java-Entwurfsmuster (design pattern): State

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der Verhaltensmuster (Behavioral Patterns) – State. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation (interaction) zwischen Objekten und ihrer Verantwortung (responsibility).

Was ist das Entwurfsmuster State?

State ist ein Entwurfsmuster, das es einem Objekt ermöglicht, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert. Im Muster erstellen wir Objekte, die die einzelnen Zustände darstellen, sowie ein Kontextobjekt, dessen Verhalten sich in Abhängigkeit vom Zustand des Objekts ändert. Zur besseren Verständlichkeit stellen wir uns einen einfachen Ticketautomaten vor. Sein Verhalten ändert sich je nach Phase des Kaufprozesses (konkreter Zustand), in der er sich befindet (z. B. Ticketauswahl, Bezahlung, Bestätigung). Die Implementierung dieses automatisierten Prozesses mithilfe des State-Entwurfsmusters würde den Code übersichtlicher machen, da die Geschäftslogik jeder Phase in separate Zustände aufgeteilt würde.

Was für ein Problem löst das Entwurfsmuster State?

Das Entwurfsmuster State löst das Problem, wenn sich ein Objekt je nach seinem aktuellen Zustand unterschiedlich verhält. Es ermöglicht, verschiedene Zustände und Übergänge zwischen ihnen zu definieren, wodurch die Zustandslogik von der Hauptlogik des Objekts getrennt wird. Dieses Konzept ähnelt endlichen Automaten (FSM – Finite State Machine). Das Verhalten jedes Zustands wird unabhängig von den anderen Zuständen definiert, und das Hinzufügen neuer Zustände sollte das Verhalten der bestehenden Zustände nicht beeinflussen.

Ein Beispiel für eine State-Implementierung in Java.

Hier ist ein praktisches Beispiel für die Implementierung des State-Entwurfsmusters in Java am Beispiel einer Ampel mit den Zuständen Rot, Gelb und Grün, die den Straßenverkehr StavSemaforu.java

package designpatterns;

public interface StavSemaforu {
    void vykonat();
}

StavSemaforu ist ein Interface, das die Methode vykonat() definiert. Jeder Zustand der Ampel (Rot, Gelb, Grün) implementiert dieses Interface und bietet eine eigene Implementierung von vykonat(). Cervena.java, Oranzova.javaZelena.java

package designpatterns;

public class Cervena implements StavSemaforu {
    @Override
    public void vykonat() {
        System.out.println("Svetlo na semafore sa preplo na červenú - premávka sa zastavila.");
    }
}

public class Oranzova implements StavSemaforu {
    @Override
    public void vykonat() {
        System.out.println("Svetlo na semafore sa preplo na oranžovú - čaká sa na zmenu.");
    }
}

public class Zelena implements StavSemaforu {
    @Override
    public void vykonat() {
        System.out.println("Svetlo na semafore sa preplo na zelenú - premávka sa rozbieha.");
    }
}

Cervena, Oranzova und Zelena sind Implementierungen des Interfaces StavSemaforu. Jede dieser Klassen repräsentiert einen konkreten Zustand der Ampel und bietet eine eigene Implementierung für vykonat(). Semafor.java

package designpatterns;

// Kontext, ktory prepina stavy
public class Semafor {
    private StavSemaforu stav;

    public Semafor() {
        this.stav = new Oranzova();
    }

    public void prepnut(StavSemaforu novyStav) {
        this.stav = novyStav;
    }

    public void vykonat() {
        stav.vykonat();
    }
}

Semafor ist eine Klasse, die den Kontext darstellt, in dem sich die Zustände der Ampel ändern. In diesem Fall wird der Semafor auf den Zustand Oranzova initialisiert. Er hat eine Methode prepnut(), die den aktuellen Zustand der Ampel auf den angegebenen neuen Zustand ändert. Er hat auch eine Methode vykonat(), die den aktuellen Zustand der Ampel ausführt. Main.java

import designpatterns.Cervena;
import designpatterns.Oranzova;
import designpatterns.Semafor;
import designpatterns.Zelena;

public class Main {
    public static void main(String[] args) {
        // Semafor je na zaciatku inicializovany na stav oranzova.
        Semafor semafor = new Semafor();
        semafor.vykonat();
        semafor.prepnut(new Cervena());
        semafor.vykonat();
        semafor.prepnut(new Oranzova());
        semafor.vykonat();
        semafor.prepnut(new Zelena());
        semafor.vykonat();
    }
}

In der Klasse Main simulieren wir den Betrieb der Verkehrsampel. Wir erstellen eine Instanz der Ampel, die zu Beginn im Zustand Gelb ist. Dann ändern wir den Zustand der Ampel mit der Methode prepnout() und rufen anschließend die Methode vykonat() auf, die die für den aktuellen Zustand definierte Geschäftslogik verarbeitet. Die Ausgabe dieses Beispiels ist: Beispiel für die Ausgabe des Java-Entwurfsmusters: State (design pattern)

Zusammenfassung

Das Entwurfsmuster State ist nützlich, wenn wir eine endliche Anzahl von Zuständen definiert haben, die ein Objekt durchlaufen kann, und wir eine Aktion ausführen müssen, wenn sich sein interner Zustand ändert. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java State Code hier herunter. Wenn du ein Java-Programmierer auf der Suche nach Arbeit bist, dann schau dir unsere Mitarbeiterbenefits an und reagiere auf unsere aktuellen Stellenangebote.

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich