Das Zustandsmuster

20
Das Zustandsmuster – Eine Einführung Julian Fietkau Universität Hamburg 25. August 2010

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