Patró estat

De Viquipèdia
Salta a: navegació, cerca

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 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 la mantenibilitat.[1][2]

Estructura[modifica]

Estat en UML[1][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]

A Wikimedia Commons hi ha contingut multimèdia relatiu a: Patró estat Modifica l'enllaç a Wikidata