Padrão de Design de Estado em Java

padrão de design de estado é um dos padrões de design comportamental. O padrão de design de estado é usado quando um objeto altera seu comportamento com base em seu estado interno.

Padrão de Design de Estado

Se precisarmos alterar o comportamento de um objeto com base em seu estado, podemos ter uma variável de estado no objeto. Em seguida, use um bloco de condição if-else para executar diferentes ações com base no estado. O padrão de design de estado é usado para fornecer uma maneira sistemática e fracamente acoplada de alcançar isso por meio das implementações de Contexto e Estado. Padrão de Estado Contexto é a classe que possui uma referência de Estado para uma das implementações concretas de Estado. O Contexto encaminha a solicitação para o objeto de estado para processamento. Vamos entender isso com um exemplo simples. Suponha que queiramos implementar um Controle Remoto de TV com um botão simples para executar uma ação. Se o estado for LIGADO, ele ligará a TV e se o estado for DESLIGADO, desligará a TV. Podemos implementar isso usando uma condição if-else como abaixo; 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();
	}

}

Repare que o código do cliente deve conhecer os valores específicos a serem usados para definir o estado do controle remoto. Além disso, se o número de estados aumentar, o acoplamento rígido entre a implementação e o código do cliente será muito difícil de manter e estender. Agora, vamos usar o padrão State para implementar o exemplo acima do Controle Remoto da TV.

Interface do Padrão de Projeto State

Primeiro, vamos criar uma interface de Estado que definirá o método a ser implementado por diferentes estados concretos e pela classe de contexto. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

Implementações de Estado Concreto do Padrão de Projeto State

No nosso exemplo, podemos ter dois estados – um para ligar a TV e outro para desligá-la. Portanto, vamos criar duas implementações concretas de estado para esses comportamentos. 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");
	}

}

Agora estamos prontos para implementar nosso objeto de contexto, que mudará seu comportamento com base no seu estado interno.

Implementação do Padrão de Design de Estado

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();
	}

}

Observe que o Contexto também implementa o Estado e mantém uma referência do seu estado atual, encaminhando a solicitação para a implementação do estado.

Programa de Teste do Padrão de Design de Estado

Agora, vamos escrever um programa simples para testar a implementação do padrão de design de estado do controle remoto da 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();
		
	}

}

A saída do programa acima é a mesma que a implementação básica do controle remoto da TV sem o uso do padrão de design de estado.

Benefícios do Padrão de Design de Estado

Os benefícios de usar o padrão State para implementar comportamento polimórfico são claramente visíveis. As chances de erro são menores e é muito fácil adicionar mais estados para comportamentos adicionais. Isso torna nosso código mais robusto, facilmente mantível e flexível. Além disso, o padrão State ajuda a evitar lógica condicional if-else ou switch-case nesse cenário. O padrão State é muito semelhante ao padrão Strategy, confira Padrão Strategy em Java. Isso é tudo para o padrão de design State em Java, espero que você tenha gostado.

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