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