Padrão de Design State em Java

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

Padrão de Design State

Se precisarmos alterar o comportamento de um objeto com base em seu estado, podemos ter uma variável de estado no objeto. Em seguida, utilizamos o bloco condicional if-else para executar ações diferentes com base no estado. O padrão de design State é 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 State Contexto é a classe que possui uma referência de Estado para uma das implementações concretas do 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 realizar uma ação. Se o Estado for LIGADO, ele ligará a TV e se o estado for DESLIGADO, ele desligará a TV. Podemos implementar isso usando a 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();
	}

}

Observe 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á difícil de manter e estender. Agora vamos usar o padrão de Estado para implementar o exemplo acima do controle remoto da TV.

Interface do Padrão de Design de Estado

Primeiramente, criaremos 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 Concretas do Estado no Padrão de Design

Em nosso exemplo, podemos ter dois estados – um para ligar a TV e outro para desligá-la. Portanto, criaremos 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 alterará seu comportamento com base em seu estado interno.

Implementação de Contexto de Padrão de Projeto 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();
	}

}

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

Programa de Teste de Padrão de Projeto State

Agora vamos escrever um programa simples para testar nossa implementação de padrão de estado do Controle 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();
		
	}

}

A saída do programa acima é a mesma que a implementação básica do Controle Remoto de TV sem usar o padrão de estado.

Benefícios do Padrão de Projeto State

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 ajudou a evitar lógica condicional if-else ou switch-case neste cenário. O padrão State é muito semelhante ao padrão Strategy, confira o 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