+ All Categories
Home > Documents > Designpattern "State"

Designpattern "State"

Date post: 13-Jul-2015
Category:
Upload: danielbuechele
View: 289 times
Download: 0 times
Share this document with a friend
24
Gruppe02 Dani. Sebastian. Felix. Franzi. Designpattern “State”
Transcript

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.

Context State

ConcreteState ConcreteState ConcreteState

Client

Gruppe02 Dani. Sebastian. Felix. Franzi.

Anwendung

Gruppe02 Dani. Sebastian. Felix. Franzi.

• Verhalten zur Laufzeit ändern

• Methoden mit ähnlicher Struktur

• Variablen zur Zustandsspeicherung

• Übergänge zwischen Zuständen

    public void go(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }    public void stop(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }    public void exit(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }

Anwendung

Gruppe02 Dani. Sebastian. Felix. Franzi.

    public void go(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }    public void stop(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }    public void exit(){        if (currentState == STATE_A){            //Zustand A...        } else if (currentState == STATE_B){

            //Zustand B...        } else if (currentState == STATE_C){

            //Zustand C...        }     }

STATE_A go() stop() exit()

STATE_B go() stop() exit()

STATE_C go() stop() exit()

<<Interface>> go() stop() exit()

mein Objekt

Anwendung

Gruppe02 Dani. Sebastian. Felix. Franzi.

konkrete Beispiele

Gruppe02 Dani. Sebastian. Felix. Franzi.

Zustände: Pinsel Pfad Text etc...

Objekt: Arbeitsfläche

<<Interface>> click() drag() release()

Gruppe02 Dani. Sebastian. Felix. Franzi.

TCPEstablished doOpen() doClose() doACK()

TCPListen doOpen() doClose() doACK()

TCPClosed doOpen() doClose() doACK()

<<Interface>> doOpen() doClose() doACK()

TCPConnection

open() close() acknowledge()

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

nichtsEssen()

nichtsTrinken()

Durst

Hunger

trinken()

essen()

Zufrieden

Gruppe02 Dani. Sebastian. Felix. Franzi.

<<Interface>>State

+ essen() + trinken() + nichtsEssen() + nichtsTrinken()

Context

- state: State

+ getState()

+ setState()

Hunger

+ essen()

Durst

+ trinken()

Zufrieden

+ 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


Recommended