Vés al contingut

Patró estat

De la Viquipèdia, l'enciclopèdia lliure

El patró estat, que està molt lligat al patró d'estratègia, és un patró de disseny de comportament. S'utilitza en programació quan es vol encapsular el comportament d'un objecte segons l'estat intern del mateix objecte. Aquesta és possiblement la manera més neta de canviar el comportament d'un objecte en temps d'execució sense recórrer a declaracions condicionals monolítiques important i així millorar el manteniment.[1]

Estructura

[modifica]
Estat en UML[2][3]
Estat en LePUS3[3][4]

Exemple

[modifica]

Java

[modifica]

L'interfície Estat i dues implementacions. El mètode de l'estat té una referència a l'objecte de context i és capaç de canviar el seu estat.

interface Statelike {

 void writeName(StateContext context, String nom);

}

class StateLowerCase implements Statelike {

 @Override
 public void writeName(final StateContext context, final String nom) {
 System.out.println(nom.toLowerCase());
 context.setState(new StateMultipleUpperCase());
 }

}

class StateMultipleUpperCase implements Statelike {
 /** Contador local del seu estat */
 private int count = 0;

 @Override
 public void writeName(final StateContext context, final String nom) {
 System.out.println(nom.toUpperCase());
 /* Canvia el seu estat després que s'invoqui writeName() de la classe StateMultipleUpperCase dues vegades */
 if(++count > 1) {
 context.setState(new StateLowerCase());
 }
 }

}

La classe de context té una variable estat que el instancia el seu estat inicial, en aquest cas StateLowerCase. En el seu mètode, utilitza els mètodes corresponents de l'estat de l'objecte.

class StateContext {
 private Statelike myState;
 StateContext() {
 setState(new StateLowerCase());
 }

 /**
 * Mètode Setter de l'estat.
 * Normalment només es invocada per classes que implementen la interfície Estat.
 * @param newState el nou estat del context
 */
 void setState(final Statelike newState) {
 myState = newState;
 }

 public void writeName(final String nom) {
 myState.writeName(this, nom);
 }
}

El codi de sota és la demostració d'ús:

public class DemoOfClientState {
 public static void main(String[] args) {
 final StateContext sc = new StateContext();

 sc.writeName("Dilluns");
 sc.writeName("Dimarts");
 sc.writeName("Dimecres");
 sc.writeName("Dijous");
 sc.writeName("Divendres");
 sc.writeName("Dissabte");
 sc.writeName("Diumenge");
 }
}

Si s'ha seguit el codi superior, la sortida del main() de la classe públicaDemoOfClientState hauria de ser:

Dilluns
DIMARTS
DIMECRES
Dijous
DIVENDRES
DISSABTE
Diumenge

Referències

[modifica]
  1. «The State Design Pattern vs. State Machine». CodeProject. [Consulta: 5 maig 2015].
  2. Erich Gamma; Richard Helm, Ralph Johnson, John M. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995. ISBN 0-201-63361-2. 
  3. 3,0 3,1 «State pattern in UML and in LePUS3». Arxivat de l'original el 2016-08-05. [Consulta: 9 juliol 2015].
  4. «legend». Arxivat de l'original el 2018-03-14. [Consulta: 9 juliol 2015].