Patrón de diseño State en Java

El patrón de diseño State es uno de los patrones de diseño de comportamiento. El patrón de diseño State se utiliza cuando un objeto cambia su comportamiento según su estado interno.

Patrón de Diseño State

Si tenemos que cambiar el comportamiento de un objeto según su estado, podemos tener una variable de estado en el objeto. Luego, usar un bloque de condiciones if-else para realizar diferentes acciones según el estado. El patrón de diseño State se utiliza para proporcionar una forma sistemática y desacoplada de lograr esto a través de las implementaciones de Contexto y Estado. El Contexto del Patrón de Estado es la clase que tiene una referencia de Estado a una de las implementaciones concretas del Estado. El Contexto reenvía la solicitud al objeto de estado para su procesamiento. Entendamos esto con un ejemplo simple. Supongamos que queremos implementar un control remoto de televisión con un botón simple para realizar una acción. Si el estado es ENCENDIDO, encenderá el televisor y si el estado es APAGADO, apagará el televisor. Podemos implementarlo usando una condición if-else como se muestra a continuación; TVRemoteBasic.java

package com.journaldev.design.state;

public class TVRemoteBasic {

	private String state="";
	
	public void setState(String state){
		this.state=state;
	}
	
	public void doAction(){
		if(state.equalsIgnoreCase("ON")){
			System.out.println("TV is turned ON");
		}else if(state.equalsIgnoreCase("OFF")){
			System.out.println("TV is turned OFF");
		}
	}

	public static void main(String args[]){
		TVRemoteBasic remote = new TVRemoteBasic();
		
		remote.setState("ON");
		remote.doAction();
		
		remote.setState("OFF");
		remote.doAction();
	}

}

Tenga en cuenta que el código del cliente debe conocer los valores específicos para usar al establecer el estado del remoto. Además, si el número de estados aumenta, entonces el acoplamiento fuerte entre la implementación y el código del cliente será muy difícil de mantener y extender. Ahora usaremos el patrón de Estado para implementar el ejemplo del control remoto de la TV mencionado anteriormente.

Interfaz del Patrón de Diseño de Estado

Primero que nada, crearemos la interfaz Estado que definirá el método que debe ser implementado por los diferentes estados concretos y la clase de contexto. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

Implementaciones de Estado Concreto del Patrón de Diseño de Estado

En nuestro ejemplo, podemos tener dos estados – uno para encender la TV y otro para apagarla. Así que crearemos dos implementaciones de estado concreto para estos comportamientos. TVStartState.java

package com.journaldev.design.state;

public class TVStartState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned ON");
	}

}

TVStopState.java

package com.journaldev.design.state;

public class TVStopState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned OFF");
	}

}

Ahora estamos listos para implementar nuestro objeto Contexto que cambiará su comportamiento basado en su estado interno.

Implementación del Contexto del Patrón de Diseño State

TVContext.java

package com.journaldev.design.state;

public class TVContext implements State {

	private State tvState;

	public void setState(State state) {
		this.tvState=state;
	}

	public State getState() {
		return this.tvState;
	}

	@Override
	public void doAction() {
		this.tvState.doAction();
	}

}

Observa que Contexto también implementa Estado y mantiene una referencia de su estado actual, reenviando la solicitud a la implementación de estado.

Programa de Prueba del Patrón de Diseño State

Ahora vamos a escribir un programa simple para probar nuestra implementación del patrón de estado del Control Remoto de TV. TVRemote.java

package com.journaldev.design.state;

public class TVRemote {

	public static void main(String[] args) {
		TVContext context = new TVContext();
		State tvStartState = new TVStartState();
		State tvStopState = new TVStopState();
		
		context.setState(tvStartState);
		context.doAction();
		
		
		context.setState(tvStopState);
		context.doAction();
		
	}

}

La salida del programa anterior es la misma que la implementación básica del Control Remoto de TV sin usar el patrón de estado.

Beneficios del Patrón de Diseño State

Los beneficios de utilizar el patrón de Estado para implementar un comportamiento polimórfico son claramente visibles. Las posibilidades de error son menores y es muy fácil agregar más estados para un comportamiento adicional. Esto hace que nuestro código sea más robusto, fácil de mantener y flexible. Además, el patrón de Estado ayuda a evitar la lógica condicional if-else o switch-case en este escenario. El patrón de Estado es muy similar al patrón de Estrategia, echa un vistazo a Patrón de Estrategia en Java. Eso es todo para el patrón de diseño de Estado en Java, espero que te haya gustado.

Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java