STATE PDD JAVA - tectijuana/javapdd16a-Archived GitHub Wiki
PDD STATE EN JAVA
Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Busca que un objeto pueda reaccionar según su estado interno. Si bien muchas veces esto se puede solucionar con un boolean o utilizando constantes, esto suele terminar con una gran cantidad de if-else, código ilegible y dificultad en el mantenimiento. La intención del State es desacoplar el estado de la clase en cuestión.
En determinadas ocasiones se requiere que un objeto tenga diferentes comportamientos según el estado en que se encuentra. Esto resulta complicado de manejar, sobretodo cuando se debe tener en cuenta el cambio de comportamientos y estados de dicho objeto, todos dentro del mismo bloque de código. El patrón State propone una solución a esta complicación, creando un objeto por cada estado posible.
Este patrón debe ser utilizado cuando:
El comportamiento de un objeto depende de un estado, y debe cambiar en tiempo de ejecución según el comportamiento del estado. Cuando las operaciones tienen largas sentencias con múltiples ramas que depende del estado del objeto.
Este patrón se utiliza cuando un determinado objeto tiene diferentes estados y también distintas responsabilidades según el estado en que se encuentre en determinado instante. También puede utilizarse para simplificar casos en los que se tiene un complicado y extenso código de decisión que depende del estado del objeto.
Main.java:
package State;
public class Main
{
public static void main(String[] args)
{
Semaforo objSemaforo = new Semaforo();
// Muestra el aviso por defecto (verde, no hay alerta)
objSemaforo.mostrar();
objSemaforo.setEstado( new EstadoNaranja() );
objSemaforo.mostrar();
objSemaforo.setEstado( new EstadoRojo() );
objSemaforo.mostrar();
}
}
Semaforo.java (Contexto según el diagrama anterior):
package State;
public class Semaforo
{
private EstadoSemaforo objEstadoSemaforo;
// -------------------------------------------
public Semaforo() {
this.objEstadoSemaforo = new EstadoVerde();
}
// -------------------------------------------
public void setEstado( EstadoSemaforo objEstadoSemaforo ) {
this.objEstadoSemaforo = objEstadoSemaforo;
}
// -------------------------------------------
@Override
public void mostrar() {
this.objEstadoSemaforo.mostrar();
}
}
EstadoSemaforo.java (Estado según el diagrama anterior):
Package State;
public abstract class EstadoSemaforo
{
// Método que deberán crear las clases que hereden de ésta
public abstract void mostrar();
}
EstadoVerde.java (un EstadoConcreto según el diagrama anterior):
package State;
public class EstadoVerde extends EstadoSemaforo
{
public EstadoVerde() {
}
// -------------------------------------------
@Override
public void mostrar() {
System.out.println("Luz verde");
}
}
EstadoNaranja.java (un EstadoConcreto según el diagrama anterior):
package State;
public class EstadoVerde extends EstadoSemaforo
{
public EstadoVerde() {
}
// -------------------------------------------
@Override
public void mostrar() {
System.out.println("Luz naranja");
}
}
EstadoRojo.java (un EstadoConcreto según el diagrama anterior):
package State;
public class EstadoVerde extends EstadoSemaforo
{
public EstadoVerde() {
}
// -------------------------------------------
@Override
public void mostrar() {
System.out.println("Luz roja");
}
}