Die Idee beim Muster Zustand ist es, die zustandsabhängigen Methoden und
Daten in ein eigenes Zustandsobjekt auszulagern. Das ursprüngliche Objekt
delegiert dann die betreffenden Funktionen an das Zustandsobjekt.
Der typische Anwendungsfall sieht so aus:
- In einer Klasse haben viele Methoden in Abhängigkeit vom Objektzustand ein
völlig unterschiedliches Verhalten, so daß die Implementierung dieser Methoden
jeweils im wesentlichen wie folgt aussieht:
Wenn Zustand1, dann Aktion1 Wenn Zustand2, dann
Aktion2 ... Wenn ZustandN, dann AktionN
- Es gibt viele verschiedene Zustände.
- In manchen Zuständen werden viele Daten gespeichert, während sie in anderen
Zuständen nur unnötig Platz belegen.
Die Anwendung des Musters Zustand bewirkt folgende Änderungen: (In
Klammern jeweils die betreffende Stelle im Beispiel)
- Der aktuelle Zustand wird nicht mehr durch die Werte einfacher
Instanzvariablen bestimmt, sondern durch eine Referenz auf ein Zustandsobjekt
von einem abstrakten Zustandstyp (state in Klasse
Machine.e/Machine.java).
- Es gibt eine Klasse für den abstrakten Zustandstyp
(AbstractState.e/AbstractState.java)
und je eine konkrete Klasse für einen Zustand
(StateEmpty.e/StateEmpty.java und
StateCard.e/StateCard.java).
- Ein Zustandswechsel wird nicht mehr durch das Ändern der Instanzvariablen
erreicht, sondern es wird ein neues Zustandsobjekt erzeugt und die
Zustandsreferenz darauf gesetzt (hierzu dient die Methode set_state in
der Klasse Machine.e/Machine.java).
- In einer Zustandsklasse sind die zustandsabhängigen Methoden enthalten,
jeweils mit der zum Zustand gehörenden Aktion. Die Methode in der
Ursprungsklasse leitet dann nur noch den Methodenaufruf an das Zustandsobjekt
weiter (siehe z.B. Methode show_state in den Klassen
Machine.e/Machine.java,
StateEmpty.e /StateEmpty.java und
StateCard.e/StateCard.java).
Diese Struktur bedeutet im Endeffekt eine Sortierung der Aktionen nach Zuständen, während sie vorher nach
Methoden sortiert waren.
- Bei Daten, die nur in einem Zustand vorhanden sein sollen, werden die
entsprechenden Instanzvariablen nur in der betreffenden Zustandsklasse definiert
(z.B. my_card in der Klasse
StateCard.e/StateCard.java).
Die für alle Zustände gültigen Daten verbleiben in der Ursprungsklasse (count in der Klasse
Machine.e/Machine.java).
|