Estrutura do Padrão State
O padrão State permite que um objeto altere seu comportamento quendo seu estado interno muda, simulnado uma mudança de classe. A arquitetura básica compreende:
- Contexto: Mantém uma referência ao estado atual e delega ações para ele
- Estado: Interface que define operações comuns para todos os estados
- EstadoConcreto: Implementações específicas para cada estado
Implemantação Básica
// Interface de estado para operações genéricas
public interface Estado {
void executarAcao(String parametro);
}
// Estados concretos com implementações distintas
public class EstadoConcretoA implements Estado {
public void executarAcao(String parametro) {
// Lógica específica para estado A
}
}
public class EstadoConcretoB implements Estado {
public void executarAcao(String parametro) {
// Implementação para estado B
}
}
// Contexto gerenciando transições de estado
public class Contexto {
private Estado estadoAtual;
public void mudarEstado(Estado novoEstado) {
this.estadoAtual = novoEstado;
}
public void acao(String parametro) {
estadoAtual.executarAcao(parametro);
}
}
Caso Prático: Sistema de Votação
Exemplo de aplicação com controle de votos e estados dinâmicos:
// Interface específica para estados de votação
public interface EstadoVoto {
void registrarVoto(String usuario, String opcao, GerenciadorVoto gerenciador);
}
// Estados concretos com regras de negócio
public class VotoNormal implements EstadoVoto {
public void registrarVoto(String usuario, String opcao, GerenciadorVoto gerenciador) {
gerenciador.armazenarVoto(usuario, opcao);
System.out.println("Voto registrado com sucesso");
}
}
public class VotoDuplicado implements EstadoVoto {
public void registrarVoto(String usuario, String opcao, GerenciadorVoto gerenciador) {
System.out.println("Erro: Voto duplicado não permitido");
}
}
// Gerenciador de contexto com lógica de transição
public class GerenciadorVoto {
private EstadoVoto estado;
private Map<string string=""> registroVotos = new HashMap<>();
private Map<string integer=""> contadorVotos = new HashMap<>();
public void votar(String usuario, String opcao) {
atualizarContador(usuario);
// Determina estado com base no contador
if (contadorVotos.get(usuario) == 1) {
estado = new VotoNormal();
} else if (contadorVotos.get(usuario) > 5) {
estado = new VotoSuspeito();
} else {
estado = new VotoDuplicado();
}
estado.registrarVoto(usuario, opcao, this);
}
private void atualizarContador(String usuario) {
contadorVotos.put(usuario, contadorVotos.getOrDefault(usuario, 0) + 1);
}
void armazenarVoto(String usuario, String opcao) {
registroVotos.put(usuario, opcao);
}
}</string></string>
Classe Cliente
public class Aplicacao {
public static void main(String[] args) {
GerenciadorVoto sistema = new GerenciadorVoto();
for(int i=0; i<6; i++) {
sistema.votar("usuario1", "opcaoA");
}
}
}