Design Pattern #6

Autor: NathalieOhneHerz GitHub

Das State Pattern

Status, Reaktion und Ablauf

Hauptartikel: [Design Pattern #1] Was sind die Design patterns


Was ist das State Pattern und wann nutzt man es?

Oft hat eine Operation oder ein Algorithmus einen gewissen Status (engl. State). Je nachdem wie dieser aussieht, kann es sein, dass unterschiedlich auf ein und dieselbe Aufgabe reagiert werden soll. Man kann das State Pattern den Verhaltensmuster zuordnen. In der Regel wird beim State Pattern jeder mögliche Status durch ein Objekt repräsentiert. Anwendungen findet man viele in der Spieleentwicklung. Man hat zum Beispiel im Spiel bestimmte Phasen (oft "GameState" genannt):

  1. Lobby
  2. Countdown
  3. Ingame
  4. End
  5. ERROR

Jeder Status hat dabei ein eigenes Verhalten zur Folge.


Modellierung


Implementierung in Java

package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public interface State { void processAction(Context context); }
package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public class StateStart implements State { public void processAction(Context context) { System.out.println("Program is starting up!"); context.setState(this); } }
package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public class StateRuntime implements State { public void processAction(Context context) { System.out.println("Porgram is running."); context.setState(this); } }
package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public class StateStop implements State { public void processAction(Context context) { System.out.println("Program is stopping"); context.setState(this); } }
package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public class Context { private State state = new StateStart(); public void setState(State state) { this.state = state; } public State getState() { return state; } }

Die Verwendung sieht dann zum Beispiel so aus:

package de.nathalieoneill.devtek.state; /** * @author Nathalie */ public class DevTek { private static Context context; public static void main(String[] args) { context = new Context(); /* Beginning */ new StateStart().processAction(context); System.out.println("Current State: " + context.getState().getClass().getSimpleName()); /* Middle */ new StateRuntime().processAction(context); System.out.println("Current State: " + context.getState().getClass().getSimpleName()); /* End */ new StateStop().processAction(context); System.out.println("Current State: " + context.getState().getClass().getSimpleName()); } }

Ich hoffe, dass ich euch das State Pattern näher bringen konnte.

Mit freundlichen Grüßen
Nathalie