Patró estatEl 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] EstructuraExempleJavaL'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 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ública Dilluns DIMARTS DIMECRES Dijous DIVENDRES DISSABTE Diumenge Referències
|