2. Gruppe02 Dani. Sebastian. Felix. Franzi.
Wie funktioniert
„State“ allgemein?
3. Gruppe02 Dani. Sebastian. Felix. Franzi.
• Objektbasiertes Verhaltensmuster
(behavioral pattern)
• Ermöglicht es einem Objekt sein Verhalten zu
ändern, wenn sich dessen interner Zustand
verändert. Es scheint dann so, als hätte das
Objekt seine Klasse gewechselt.
• Einfache Änderung des Objektverhaltens zur
Laufzeit.
4. Gruppe02 Dani. Sebastian. Felix. Franzi.
• Das zustandsabhängige Verhalten des Objekts
wird in separate Klassen ausgelagert, wobei für
jeden möglichen Zustand eine eigene Klasse
eingeführt wird, die das Verhalten des Objekts
in diesem Zustand definiert.
• Damit Context die separaten Zustandsklassen
einheitlich behandeln kann, wird eine
gemeinsame Abstrahierung dieser Klassen
definiert.
5. Gruppe02 Dani. Sebastian. Felix. Franzi.
• Context definiert die clientseitige Schnittstelle,
verwaltet die separaten Zustandsklassen. Bei
einem Zustandsübergang tauscht der Context
das von ihm verwendete Zustandsobjekt aus.
Client Context State
ConcreteState ConcreteState ConcreteState
13. Gruppe02 Dani. Sebastian. Felix. Franzi.
Vorteile
• Vermeidung von komplexen, ggf. schwer lesbaren
Bedingungsanweisungen
• Neue Zustände können sehr einfach hinzugefügt
werden
• Zustandsobjekte können wiederverwertet werden
• Leichter zu warten
14. Gruppe02 Dani. Sebastian. Felix. Franzi.
Nachteile
• Hoher Implementierungsaufwand
→ bei einfachen zustandsbehafteten Verhalten
nicht gerechtfertigt
( Ab Java 1.5 durch enums geringerer Aufwand
gegenüber C++ )
18. Gruppe02 Dani. Sebastian. Felix. Franzi.
public class Context {
private State state;
public void setState(State state){
this.state = state;
}
public State getState(){
return this.state;
}
}
19. Gruppe02 Dani. Sebastian. Felix. Franzi.
public interface State {
public void essen();
public void trinken();
public void nichtsEssen();
public void nichtsTrinken();
}
20. Gruppe02 Dani. Sebastian. Felix. Franzi.
public class Hunger implements State{
private Context context;
public Hunger(Context context){
this.context = context;
System.out.println("Ich habe Hunger.");
}
public void essen(){
this.context.setState(new Zufrieden(this.context));
}
public void trinken(){}
public void nichtsEssen(){}
public void nichtsTrinken(){}
}
21. Gruppe02 Dani. Sebastian. Felix. Franzi.
public class Durst implements State{
private Context context;
public Durst(Context context){
this.context = context;
System.out.println("Ich habe Durst.");
}
public void essen(){}
public void trinken(){
this.context.setState(new Zufrieden(this.context));
}
public void nichtsEssen(){}
public void nichtsTrinken(){}
}
22. Gruppe02 Dani. Sebastian. Felix. Franzi.
public class Zufrieden implements State{
private Context context;
public Zufrieden(Context context){
this.context = context;
System.out.println("Ich bin Zufrieden.");
}
public void essen(){}
public void trinken(){}
public void nichtsEssen(){
this.context.setState(new Hunger(this.context));
}
public void nichtsTrinken(){
this.context.setState(new Durst(this.context));
}
}