Zustand [ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]


Übersicht

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).


[ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]
Stand: 31.03.2005, Autor: Jan Echternach