Padrão de Projeto State em Java

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

Tags: java Padrões de Projeto Padrão State

Publicado em 9-16 21:55