Patró estat

en informàtica, un patró de disseny conductual

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]

EstructuraModifica

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

ExempleModifica

JavaModifica

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ènciesModifica

  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].
A Wikimedia Commons hi ha contingut multimèdia relatiu a: Patró estat