Das Zustandsmuster
-
Upload
julian-fietkau -
Category
Technology
-
view
1.148 -
download
0
Transcript of Das Zustandsmuster
-
Das Zustandsmuster Eine Einfhrung
Julian Fietkau
Universitt Hamburg
25. August 2010
-
Julian Fietkau
Organisatorisches vorweg
Diese Folien sind unter CC-BY-SA 3.0 freigegeben.Alle Illustrationen, soweit sie nicht von mir erstelltwurden, stammen aus dem OpenClipArt-Projekt.
Folien-Download und Feedback-Mglichkeit:
http://www.julian-fietkau.de/das_zustandsmuster
2 / 14
http://www.julian-fietkau.de/das_zustandsmuster
-
Inhaltsverzeichnis Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
3 / 14
-
Was sind Entwurfsmuster? Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
3 / 14
-
Was sind Entwurfsmuster? Julian Fietkau
Die Grundidee (objektorientierter) Entwurfsmuster
Beim objektorientierten Entwurf wird ein abstraktes Modell inKlassen bzw. Code gegossen. Wie genau das geschieht ist eineFrage von Design.
Hierbei tauchen bestimmte abstrakte Fragen immer wieder auf(Meta-Probleme).
Objektorientierte Entwurfsmuster bieten schablonenartigeLsungen fr solche Meta-Probleme. Es liegt am Programmie-rer, das Muster auf das konkrete Problem zu bertragen.
4 / 14
-
Was sind Entwurfsmuster? Julian Fietkau
Standardliteratur
Entwurfsmuster: Elemente wiederverwendbarer objektorientierterSoftware (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)
5 / 14
-
Ein Beispiel fr zustandsbasiertes Verhalten Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
5 / 14
-
Ein Beispiel fr zustandsbasiertes Verhalten Julian Fietkau
Der Kippschalter einer Lampe
Mgliche Zustnde: Licht aus, halbe Helligkeit, volle HelligkeitMgliche Aktionen: drcke links, drcke rechts
Zustandsabhngiges Verhalten: Wie hell ist die Lampe?
6 / 14
-
Ein Beispiel fr zustandsbasiertes Verhalten Julian Fietkau
Das Zustandsdiagramm
Licht aus
drcke rechts
dr
cke
links
dr
cke rech
ts
HalbeHelligkeit
VolleHelligkeit
drcke rechts
drcke links drcke links
7 / 14
-
Ein Beispiel fr zustandsbasiertes Verhalten Julian Fietkau 1 public class Lampe {
private enum LampeZustand {LICHT_AUS, HALBE_HELLIGKEIT, VOLLE_HELLIGKEIT;
5 }
private LampeZustand zustand = LampeZustand.LICHT_AUS;
public void drueckeLinks() {10 if(zustand == LampeZustand.LICHT_AUS) {
zustand = LampeZustand.VOLLE_HELLIGKEIT;} else if(zustand == LampeZustand.HALBE_HELLIGKEIT) {
zustand = LampeZustand.LICHT_AUS;}
15 }
public void drueckeRechts() {...}
public double gibHelligkeit() {20 double helligkeit = 0.0;
if(zustand == LampeZustand.LICHT_AUS) {helligkeit = 0.0;
} else if(zustand == LampeZustand.HALBE_HELLIGKEIT) {helligkeit = 0.5;
25 } else if(zustand == LampeZustand.VOLLE_HELLIGKEIT) {helligkeit = 1.0;
}return helligkeit;
}30 }
Lampe.java8 / 14
Listings/2NaivMitEnum/Lampe.javapublicclassLampe{
privateenumLampeZustand{
LICHT_AUS,HALBE_HELLIGKEIT,VOLLE_HELLIGKEIT;
}
privateLampeZustandzustand=LampeZustand.LICHT_AUS;
publicvoiddrueckeLinks(){
if(zustand==LampeZustand.LICHT_AUS){
zustand=LampeZustand.VOLLE_HELLIGKEIT;
}elseif(zustand==LampeZustand.HALBE_HELLIGKEIT){
zustand=LampeZustand.LICHT_AUS;
}
}
publicvoiddrueckeRechts(){...}
publicdoublegibHelligkeit(){
doublehelligkeit=0.0;
if(zustand==LampeZustand.LICHT_AUS){
helligkeit=0.0;
}elseif(zustand==LampeZustand.HALBE_HELLIGKEIT){
helligkeit=0.5;
}elseif(zustand==LampeZustand.VOLLE_HELLIGKEIT){
helligkeit=1.0;
}
returnhelligkeit;
}
}
Naive Umsetzung: Lampe.java
-
Das Zustandsmuster Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
8 / 14
-
Das Zustandsmuster Julian Fietkau
Abstrakte Darstellung des Zustandsmusters
Context
State : myState
request()
...
myState.handle();
...
State
handle()
ConcreteStateA
handle()
ConcreteStateB
handle()
Der Kontext hlt ein Zustandsobjekt Zustandsabhngiges Verhalten wird dorthin delegiert Wie funktionieren bergnge?
9 / 14
-
Implementation des Beispiels Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
9 / 14
-
Implementation des Beispiels Julian Fietkau
Eine Variante: dezentrale bergnge
LampeZustandLichtAus
drueckeLinks() : LampeZustanddrueckeRechts() : LampeZustandgibHelligkeit() : double
Lampe
LampeZustand : zustand
drueckeLinks()drueckeRechts()gibHelligkeit() : double
LampeZustand
drueckeLinks() : LampeZustanddrueckeRechts() : LampeZustandgibHelligkeit() : double
LampeZustandVolleHelligkeit
drueckeLinks() : LampeZustanddrueckeRechts() : LampeZustandgibHelligkeit() : double
drueckeLinks() : LampeZustanddrueckeRechts() : LampeZustandgibHelligkeit() : double
LampeZustandHalbeHelligkeitpublic void drueckeLinks() { zustand =
zustand.drueckeLinks();
}
10 / 14
-
Implementation des Beispiels Julian Fietkau
1 public class Lampe {
private LampeZustand zustand;
5 public Lampe() {zustand = new LampeZustandLichtAus();
}
public void drueckeLinks() {10 zustand = zustand.drueckeLinks();
}
public void drueckeRechts() {zustand = zustand.drueckeRechts();
15 }
public double gibHelligkeit() {return zustand.gibHelligkeit();
}20 }
Lampe.java
11 / 14
Listings/3ZustandDezentral/Lampe.javapublicclassLampe{
privateLampeZustandzustand;
publicLampe(){
zustand=newLampeZustandLichtAus();
}
publicvoiddrueckeLinks(){
zustand=zustand.drueckeLinks();
}
publicvoiddrueckeRechts(){
zustand=zustand.drueckeRechts();
}
publicdoublegibHelligkeit(){
returnzustand.gibHelligkeit();
}
}
Zustandsmuster mit dezentraler Transitionsverwaltung: Lampe.java
-
Implementation des Beispiels Julian Fietkau 1 public interface LampeZustand {
public LampeZustand drueckeLinks();
public LampeZustand drueckeRechts();5
public double gibHelligkeit();}
LampeZustand.java
1 public class LampeZustandHalbeHelligkeit implements LampeZustand {
public LampeZustand drueckeLinks() {return new LampeZustandLichtAus();
5 }
public LampeZustand drueckeRechts() {return this;
}10
public double gibHelligkeit() {return 0.5;
}}
LampeZustandHalbeHelligkeit.java
12 / 14
Listings/3ZustandDezentral/LampeZustand.javapublicinterfaceLampeZustand{
publicLampeZustanddrueckeLinks();
publicLampeZustanddrueckeRechts();
publicdoublegibHelligkeit();
}
Zustandsmuster mit dezentraler Transitionsverwaltung: LampeZustand.java
Listings/3ZustandDezentral/LampeZustandHalbeHelligkeit.javapublicclassLampeZustandHalbeHelligkeitimplementsLampeZustand{
publicLampeZustanddrueckeLinks(){
returnnewLampeZustandLichtAus();
}
publicLampeZustanddrueckeRechts(){
returnthis;
}
publicdoublegibHelligkeit(){
return0.5;
}
}
Zustandsmuster mit dezentraler Transitionsverwaltung: LampeZustandHalbeHelligkeit.java
-
Implementation des Beispiels Julian Fietkau
Beobachtungen
Das zustandsabhngige Verhalten ist besser gekapselt und vomKontext getrennt
Weniger Sprnge im Code, bessere bersicht Aber: struktureller Overhead
13 / 14
-
Weiteres Wissenswertes Julian Fietkau
bersicht
Was sind Entwurfsmuster?
Ein Beispiel fr zustandsbasiertes Verhalten
Das Zustandsmuster
Implementation des Beispiels
Weiteres Wissenswertes
13 / 14
-
Weiteres Wissenswertes Julian Fietkau
Hinweise
Es gibt viele Varianten der Implementierung, die unterverschiedenen Umstnden sinnvoll sind.
In aktuellen Java-Versionen erleichtern Enums die Umsetzung. Nicht jedes zustandsabhngige Verhalten muss mit demZustandsmuster beantwortet werden - keep it simple.
Modellierung zustandsorientierter Systeme in Java: DasZustandsmuster, Varianten und Alternativen(Julian Fietkau, Janina Nemec)
http://www.julian-fietkau.de/modellierung_zustandsorientierter_systeme_in_java
14 / 14
http://www.julian-fietkau.de/modellierung_zustandsorientierter_systeme_in_javahttp://www.julian-fietkau.de/modellierung_zustandsorientierter_systeme_in_java
-
Ende Julian Fietkau
Danke fr die Aufmerksamkeit!
15 / 14
TitelfolieInhaltsverzeichnisWas sind Entwurfsmuster?Ein Beispiel fr zustandsbasiertes VerhaltenDas ZustandsmusterImplementation des BeispielsWeiteres WissenswertesEnde