SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
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)
• 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.
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.
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
Gruppe02      Dani. Sebastian. Felix. Franzi.




       Anwendung
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...
                                     } 
                                 }
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...
                                              } 
                                          }
Gruppe02       Dani. Sebastian. Felix. Franzi.




   konkrete Beispiele
Gruppe02                     Dani. Sebastian. Felix. Franzi.



       Objekt: Arbeitsfläche



                                        <<Interface>>
Zustände:                                click()
 Pinsel                                  drag()
 Pfad                                    release()
 Text
 etc...
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()
Gruppe02       Dani. Sebastian. Felix. Franzi.




    Vor- & Nachteile
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
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++ )
Gruppe02      Dani. Sebastian. Felix. Franzi.




    Implementierung
Gruppe02                           Dani. Sebastian. Felix. Franzi.



Zustandsautomat

                          Hunger
        nichtsEssen()                essen()


        Zufrieden


        nichtsTrinken()             trinken()
                          Durst
Gruppe02                       Dani. Sebastian. Felix. Franzi.




Context                              <<Interface>>
- state: State                           State
+ getState()                       + essen()
+ setState()                       + trinken()
                                   + nichtsEssen()
                                   + nichtsTrinken()




Hunger           Durst              Zufrieden
+ essen()        + trinken()       + nichtsEssen()
                                   + nichtsTrinken()
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;
	   }
	
}
Gruppe02                         Dani. Sebastian. Felix. Franzi.




public interface State {
	
	 public void essen();
	
	 public void trinken();
	
	 public void nichtsEssen();
	
	 public void nichtsTrinken();

}
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(){}

}
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(){}	

}
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));
	 }	
}
Gruppe02        Dani. Sebastian. Felix. Franzi.




     Nützliche Links
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

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (20)

Virtual Educa 2014
Virtual Educa 2014Virtual Educa 2014
Virtual Educa 2014
 
Errores de los árbitros
Errores de los árbitrosErrores de los árbitros
Errores de los árbitros
 
White blue and cold
White blue and coldWhite blue and cold
White blue and cold
 
Hippe
HippeHippe
Hippe
 
Presentación4
Presentación4Presentación4
Presentación4
 
Cuando el fotografo_era_el_pintor=rrgg
Cuando el fotografo_era_el_pintor=rrggCuando el fotografo_era_el_pintor=rrgg
Cuando el fotografo_era_el_pintor=rrgg
 
3ºb música tema 2 la edad media grupo 3
3ºb música tema 2 la edad media grupo 33ºb música tema 2 la edad media grupo 3
3ºb música tema 2 la edad media grupo 3
 
Gp Oru1
Gp Oru1Gp Oru1
Gp Oru1
 
The photography presentation
The photography presentationThe photography presentation
The photography presentation
 
Hantverk
HantverkHantverk
Hantverk
 
Just A Hummingbird
Just A HummingbirdJust A Hummingbird
Just A Hummingbird
 
merkteken beest of Geest
merkteken beest of Geestmerkteken beest of Geest
merkteken beest of Geest
 
La Isla de Pascua
La Isla de PascuaLa Isla de Pascua
La Isla de Pascua
 
Eng424 11 version 2
Eng424 11 version 2Eng424 11 version 2
Eng424 11 version 2
 
Ascensión al Jebel Toubkal
Ascensión al Jebel ToubkalAscensión al Jebel Toubkal
Ascensión al Jebel Toubkal
 
Una Ciudad En Imágenes
Una Ciudad En ImágenesUna Ciudad En Imágenes
Una Ciudad En Imágenes
 
I'm catalogo mayo 2011
I'm catalogo mayo 2011I'm catalogo mayo 2011
I'm catalogo mayo 2011
 
Propaganda
PropagandaPropaganda
Propaganda
 
Parece Que Hoy Hace Un Buen DíA
Parece Que Hoy Hace Un Buen DíAParece Que Hoy Hace Un Buen DíA
Parece Que Hoy Hace Un Buen DíA
 
Google
GoogleGoogle
Google
 

Designpattern "State"

  • 1. Gruppe02 Dani. Sebastian. Felix. Franzi. Designpattern “State”
  • 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
  • 6. Gruppe02 Dani. Sebastian. Felix. Franzi. Anwendung
  • 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. 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. Gruppe02 Dani. Sebastian. Felix. Franzi. konkrete Beispiele
  • 10. Gruppe02 Dani. Sebastian. Felix. Franzi. Objekt: Arbeitsfläche <<Interface>> Zustände: click() Pinsel drag() Pfad release() Text etc...
  • 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. Gruppe02 Dani. Sebastian. Felix. Franzi. Vor- & Nachteile
  • 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++ )
  • 15. Gruppe02 Dani. Sebastian. Felix. Franzi. Implementierung
  • 16. Gruppe02 Dani. Sebastian. Felix. Franzi. Zustandsautomat Hunger nichtsEssen() essen() Zufrieden nichtsTrinken() trinken() Durst
  • 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. 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)); } }
  • 23. Gruppe02 Dani. Sebastian. Felix. Franzi. Nützliche Links
  • 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