Gruppe02       Dani. Sebastian. Felix. Franzi. Designpattern “State”
Gruppe02       Dani. Sebastian. Felix. Franzi.    Wie funktioniert   „State“ allgemein?
Gruppe02                        Dani. Sebastian. Felix. Franzi.• Objektbasiertes Verhaltensmuster  (behavioral pattern)• E...
Gruppe02                         Dani. Sebastian. Felix. Franzi.• Das zustandsabhängige Verhalten des Objekts  wird in sep...
Gruppe02                             Dani. Sebastian. Felix. Franzi.• Context definiert die clientseitige Schnittstelle,  v...
Gruppe02      Dani. Sebastian. Felix. Franzi.       Anwendung
Gruppe02                            Dani. Sebastian. Felix. Franzi.Anwendung                               public void go(...
Gruppe02                                     Dani. Sebastian. Felix. Franzi.Anwendung                                     ...
Gruppe02       Dani. Sebastian. Felix. Franzi.   konkrete Beispiele
Gruppe02                     Dani. Sebastian. Felix. Franzi.       Objekt: Arbeitsfläche                                   ...
Gruppe02                            Dani. Sebastian. Felix. Franzi. TCPConnection                     <<Interface>>       ...
Gruppe02       Dani. Sebastian. Felix. Franzi.    Vor- & Nachteile
Gruppe02                        Dani. Sebastian. Felix. Franzi.Vorteile• Vermeidung von komplexen, ggf. schwer lesbaren  B...
Gruppe02                       Dani. Sebastian. Felix. Franzi.Nachteile• Hoher Implementierungsaufwand    → bei einfachen ...
Gruppe02      Dani. Sebastian. Felix. Franzi.    Implementierung
Gruppe02                           Dani. Sebastian. Felix. Franzi.Zustandsautomat                          Hunger        n...
Gruppe02                       Dani. Sebastian. Felix. Franzi.Context                              <<Interface>>- state: S...
Gruppe02                                 Dani. Sebastian. Felix. Franzi.public class Context {		 private State state;		   ...
Gruppe02                         Dani. Sebastian. Felix. Franzi.public interface State {		 public void essen();		 public v...
Gruppe02                              Dani. Sebastian. Felix. Franzi.public class Hunger implements State{		 private Conte...
Gruppe02                              Dani. Sebastian. Felix. Franzi.public class Durst implements State{		 private Contex...
Gruppe02                              Dani. Sebastian. Felix. Franzi.public class Zufrieden implements State{		 private Co...
Gruppe02        Dani. Sebastian. Felix. Franzi.     Nützliche Links
Gruppe02                           Dani. Sebastian. Felix. Franzi.• Entwurfsmuster State: http://www.it-academy.cc/  conte...
Nächste SlideShare
Wird geladen in …5
×

Designpattern "State"

379 Aufrufe

Veröffentlicht am

0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
379
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
35
Aktionen
Geteilt
0
Downloads
4
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Designpattern "State"

  1. 1. Gruppe02 Dani. Sebastian. Felix. Franzi. Designpattern “State”
  2. 2. Gruppe02 Dani. Sebastian. Felix. Franzi. Wie funktioniert „State“ allgemein?
  3. 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. 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. 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
  6. 6. Gruppe02 Dani. Sebastian. Felix. Franzi. Anwendung
  7. 7. Gruppe02 Dani. Sebastian. Felix. Franzi.Anwendung     public void go(){ E_A){         if (currentState == STAT• Verhalten zur Laufzeit             //Zustand A... == STATE_B){         } else if (currentState  ändern             //Zustand B... == STATE_C){         } else if (currentState              //Zustand C...• Methoden mit ähnlicher         }      } Struktur     public void stop(){         if (currentState == STAT E_A){             //Zustand A... == STATE_B){         } else if (currentState • Variablen zur             //Zustand B...         } else if (currentState  == STATE_C){ Zustandsspeicherung             //Zustand C...         }      }     public void exit(){• Übergänge zwischen         if (currentState == STAT E_A){             //Zustand A... Zuständen         } else if (currentState  == STATE_B){             //Zustand B... == STATE_C){         } else if (currentState              //Zustand C...         }      }
  8. 8. Gruppe02 Dani. Sebastian. Felix. Franzi.Anwendung     public void go(){ E_A){         if (currentState == STAT mein Objekt             //Zustand A... == STATE_B){         } else if (currentState              //Zustand B... == STATE_C){         } else if (currentState  <<Interface>>             //Zustand C...         }  go()     }     public void stop(){ stop()         if (currentState == STAT E_A){ exit()             //Zustand A... == STATE_B){         } else if (currentState              //Zustand B... == STATE_C){         } else if (currentState              //Zustand C...         } STATE_A STATE_B STATE_C     }     public void exit(){ go() go() go()         if (currentState == STAT E_A){ stop() stop() stop()             //Zustand A... == STATE_B){         } else if (currentState  exit() exit() exit()             //Zustand B... == STATE_C){         } else if (currentState              //Zustand C...         }      }
  9. 9. Gruppe02 Dani. Sebastian. Felix. Franzi. konkrete Beispiele
  10. 10. Gruppe02 Dani. Sebastian. Felix. Franzi. Objekt: Arbeitsfläche <<Interface>>Zustände: click() Pinsel drag() Pfad release() Text etc...
  11. 11. Gruppe02 Dani. Sebastian. Felix. Franzi. TCPConnection <<Interface>> doOpen() open() doClose() close() doACK() acknowledge() TCPEstablished TCPListen TCPClosed doOpen() doOpen() doOpen() doClose() doClose() doClose() doACK() doACK() doACK()
  12. 12. Gruppe02 Dani. Sebastian. Felix. Franzi. Vor- & Nachteile
  13. 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. 14. Gruppe02 Dani. Sebastian. Felix. Franzi.Nachteile• Hoher Implementierungsaufwand → bei einfachen zustandsbehafteten Verhalten nicht gerechtfertigt( Ab Java 1.5 durch enums geringerer Aufwandgegenüber C++ )
  15. 15. Gruppe02 Dani. Sebastian. Felix. Franzi. Implementierung
  16. 16. Gruppe02 Dani. Sebastian. Felix. Franzi.Zustandsautomat Hunger nichtsEssen() essen() Zufrieden nichtsTrinken() trinken() Durst
  17. 17. Gruppe02 Dani. Sebastian. Felix. Franzi.Context <<Interface>>- state: State State+ getState() + essen()+ setState() + trinken() + nichtsEssen() + nichtsTrinken()Hunger Durst Zufrieden+ essen() + trinken() + nichtsEssen() + nichtsTrinken()
  18. 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. 19. Gruppe02 Dani. Sebastian. Felix. Franzi.public interface State { public void essen(); public void trinken(); public void nichtsEssen(); public void nichtsTrinken();}
  20. 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. 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. 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)); } }
  23. 23. Gruppe02 Dani. Sebastian. Felix. Franzi. Nützliche Links
  24. 24. Gruppe02 Dani. Sebastian. Felix. Franzi.• Entwurfsmuster State: http://www.it-academy.cc/ content/article_print.php?ArticleID=1623• Software Design Patterns: http://bis.informatik.uni- leipzig.de/de/Lehre/0809/ss/LV/pattern/files? get=sdp09_speck_rene_servicevariation.pdf• Das State Design Pattern: http://philipphauer.de/ study/se/design-pattern/state.php• Wikipedia: http://de.wikipedia.org/wiki/Zustand_ %28Entwurfsmuster%29

×