Java Reference
In-Depth Information
Bei vielen Zustandsautomaten ist aber die Bestimmung des Nachfolgezustands nicht
nur abhängig von einem Ereignis, sondern auch vom aktuellen Zustand, in dem sich
der Automat gerade befindet. In diesem Falle muss die Verantwortlichkeit für die Be-
stimmung des Nachfolgezustands dem aktuellen Zustandsobjekt übertragen werden.
Denn dieses soll ja das gesamte Verhalten des Automaten in diesem Zustand kapseln.
Dafür gibt es zwei Möglichkeiten:
1. Jede Methode einer konkreten Zustandsklasse, die vom Kontextobjekt aufgerufen
wird, um ein zustandsabhängiges Verhalten zu realisieren, wie beispielsweise die
Methode operation() , liefert ein Zustandsobjekt als Ergebnis zurück, das vom
Kontextobjekt für den Zustandswechsel benutzt wird.
2. Die Methode aendereZustand() der Kontextklasse wird öffentlich gemacht und
die Methode operation() erhält einen Parameter vom Typ der Klasse Kontext .
Ruft ein Kontextobjekt die Methode operation() auf, übergibt es über diesen Pa-
rameter eine Referenz auf sich selbst an das Zustandsobjekt. Auf diese Weise
kennt ein Zustandsobjekt seinen Automaten - also das entsprechende Kontextob-
jekt - dessen Methode aendereZustand() es nun aufrufen kann, um den Nach-
folgezustand zu setzen.
In beiden Fällen entstehen zusätzliche Abhängigkeiten: Ein konkreter Zustand muss
die anderen Zustände kennen, um den Nachfolgezustand zu bestimmen. Im zweiten
Fall muss ein konkreter Zustand zusätzlich noch das Kontextobjekt kennen.
Damit konkrete Zustände die anderen Zustände kennen, gibt es mehrere Implementie-
rungsalternativen:
x Gibt es in einer Applikation nur einen einzigen Automaten einer bestimmten Klasse,
dann kann die entsprechende Klasse als Singleton-Klasse (siehe Kapitel 4.20)
realisiert werden. Die Zustandsobjekte können sich eine Referenz auf das
Singleton-Objekt besorgen.
x Kennen die Zustände ihren Automaten, kann der Automat auch alle seine mög-
lichen Zustände über get-Methoden (wie bespielsweise getKonkreterZu-
standX() ) zur Verfügung stellen.
x Als letzte Möglichkeit wäre noch die Implementierung der konkreten Zustände in
Form einer enum -Klasse zu nennen.
Diese Vorgehensweisen haben den weiteren Vorteil, dass zur Bestimmung des Nach-
folgezustands nicht jedes Mal ein neues konkretes Zustandsobjekt erzeugt wird, son-
dern bereits existierende Zustandsobjekte wiederverwendet werden.
4.14.3.5 Programmbeispiel
Als Beispiel soll hier die Alarmanlage einer Bank beschrieben werden. Befindet sich
die Alarmanlage im Zustand AlarmanlageAktiv und wird eine Person erkannt, so
wird ein akustischer Alarm als Aktion ausgegeben. Befindet sich die Anlage hingegen
im Zustand AlarmanlageInaktiv (während der Geschäftszeit der Bank), so soll
Search WWH ::




Custom Search