State Pattern
Stefan Lohr, Robert Zima
Inhalt
Eigenschaften
Motivation
Beispiel
Anwendung
Struktur
Implementierung
Generelle Struktur
Implementierungsarten
Vor- und Nachteil
Eigenschaften
Beschreibung:
Ermöglicht es einem Objekt, sein Verhalten zu ändern, wenn sein interner Zustand wechselt.
Typ:
Objektbasiert und Verhaltensorientiert
Anwendungsbeispiele:
Kaugummi-/Kaffeeautomat, TCP-Protokoll, Grafikprogramme
Auch bekannt als:
Zustand, Objekte für Zustände (Objects for States)
Motivation
Ein TCPConnector soll implementiert werden.
Das verhalten eines Objekts soll abhängig von seinem Zustand sein.
Große Switch-Anweisungen sollen aber vermieden werden.
Jeder Fall der Switch-Anweisung soll in einer eigenen Klasse implementiert werden.
Der Zustand des Objektes selbst soll wieder ein Objekt sein, das unabhängig von den anderen Objekten ist.
Beispiel - Anwendung
Ein TCPAutomat (stark vereinfacht).
Drei Zustände.
Der Verhalten der Funktionen in den
einzelnen Zuständen ist unterschiedlich.
Jeder Zustand
bekommt eine eigene Klasse anstatt einen Switch-Block.
Established Closed
Listen
PassiveOpen() Close()
Reset() SYNACK()
Beispiel - Struktur
TCPConnection:
Schnittstelle für den Benutzer mit den Funktionen einer TCPConnection.
Besitzt eine Instanz eines konkreten Zustands
TCPState:
Abstrakte Klasse die einen TCPState definiert um die Konkreten States zu Kapseln
TCPConcreteStates:
Konkrete States, die Ihrem Zustand entsprechende Implementierungen enthalten.
Beispiel - Implementierung
Vorführung des Programmcodes
Beispiel in C#
Generelle Struktur
Context:
Definiert eine Schnittstelle für den Client.
Besitzt eine Instanz eines konkreten Zustandes.
State:
Definiert eine Schnittstelle zur Kapselung des Verhaltens entsprechend einem Zustand.
ConcreteState:
Jede konkrete Klasse implementiert ein Verhalten entsprechend Ihrem Zustand.
Implementierungsarten [1/2]
Folgezustände in Tabelle hinterlegen
Verhalten kann geändert werden ohne das man das Programm ändern muss.
Tabellenzugriffe sind langsamer wie direkte Funktionsaufrufe.
Zustände beim Start erstellen
Initialaufwand ist hoch.
Sinnvoll bei vielen und schnellen Zustandsänderungen
Zustand bei gebrauch erstellen (und löschen)
Initialaufwand ist niedrig
Sinnvoll wenn die States sehr groß sind und / oder selten Zustandswechsel stattfinden.
Implementierungsarten [2/2]
Context ändert den Zustand
Context muss wissen was der Folgezustand ist.
Zustandsänderungen finden an einer Stelle statt.
Context muss alle konkreten Klassen kennen.
Jede ConcreteState ändert den Zustand selbst
Den ConcreteState Klassen wird die State-Variabel übergeben und kann somit geändert werden.
Zustandsänderungen sind dezentral.
Die Klasse muss selbst ihren Folgezustand/klasse kennen (abhänigkeit).
Vor- und Nachteil
Vorteile
Schwer zu lesende Switch-Anweisungen werden vermieden.
Weitere Zustände können auf einfache Weise hinzugefügt werden.
Die Wartbarkeit wird erhöht.
Zustandsobjekte können wiederverwendet werden.
Nachteil:
Bei einfachen Anwendungen ist der
Implementierungsaufwand verhältnismäßig sehr hoch und nicht unbedingt von Nutzen.
Vielen Dank für Eure Aufmerksamkeit
Noch Fragen?