Padrão State em Java: Guia Completo com Exemplo Prático

Em programação orientada a objetos, os padrões de projeto emergem como soluções padronizadas para desafios de design recorrentes. O Padrão de Projeto State, especificamente, é um padrão comportamental que define um método pelo qual um objeto pode alterar seu comportamento quando seu estado interno passa por modificações.

Este padrão revela-se particularmente útil quando um objeto precisa apresentar comportamentos distintos, dependendo de sua condição atual. Para ilustrar, considere um objeto que simula um interruptor de luz. Esse objeto poderia alternar entre os estados “ligado” e “desligado”. O comportamento do objeto precisa se ajustar ao estado em que se encontra, acendendo a luz quando “ligado” e apagando-a quando “desligado”.

Funcionamento do Padrão State

O Padrão de Projeto State é construído utilizando as seguintes classes e interfaces:

  • Contexto: Representa o objeto cujo estado pode mudar.
  • Estado: Uma interface que define as ações que um estado pode realizar.
  • Estado Concreto: Implementações específicas da interface Estado, representando um estado particular do objeto.

O Contexto mantém uma referência ao estado atual. Quando o estado do objeto precisa ser alterado, uma nova instância de um Estado Concreto é criada e atribuída ao Contexto. O Contexto então delega as chamadas de método para o estado atual, que por sua vez determina o comportamento específico do objeto.

Benefícios do Uso do Padrão State

Este padrão oferece diversas vantagens:

  • Encapsulamento do estado: O estado de um objeto fica encapsulado dentro de classes de estado, o que leva a um menor acoplamento entre as classes.
  • Flexibilidade: O comportamento de um objeto pode ser ajustado facilmente apenas trocando seu estado atual.
  • Reutilização: Os estados podem ser compartilhados e usados em diversos contextos.
  • Clareza: O código se torna mais fácil de entender, pois o comportamento do objeto é separado da sua lógica de estados.

Implementação Prática em Java

A seguir, apresentamos um exemplo prático do Padrão State em Java:


interface Estado {
    void ligar();
    void desligar();
}

class InterruptorLigado implements Estado {
    @Override
    public void ligar() {
        System.out.println("Luz já está acesa");
    }

    @Override
    public void desligar() {
        System.out.println("Luz apagada");
    }
}

class InterruptorDesligado implements Estado {
    @Override
    public void ligar() {
        System.out.println("Luz acesa");
    }

    @Override
    public void desligar() {
        System.out.println("Luz já está apagada");
    }
}

class Interruptor {
    private Estado estado;

    public Interruptor() {
        this.estado = new InterruptorDesligado();
    }

    public void ligar() {
        estado.ligar();
        if (estado instanceof InterruptorDesligado){
          setEstado(new InterruptorLigado());
        }
    }

    public void desligar() {
        estado.desligar();
         if (estado instanceof InterruptorLigado){
           setEstado(new InterruptorDesligado());
        }
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }
}

public class Main {
    public static void main(String[] args) {
        Interruptor interruptor = new Interruptor();

        interruptor.ligar(); // saída: Luz acesa
        interruptor.ligar(); // saída: Luz já está acesa
        interruptor.desligar(); // saída: Luz apagada
        interruptor.desligar(); // saída: Luz já está apagada
    }
}

Conclusão

O Padrão de Projeto State é uma ferramenta valiosa que permite que objetos adaptem seu comportamento de acordo com seu estado interno. Ele facilita o encapsulamento do estado do objeto, o que leva a uma maior flexibilidade e menor acoplamento. Além disso, o padrão contribui para um código mais limpo e com melhor possibilidade de reutilização de estados.

O padrão encontra aplicação em uma variedade de contextos em Java, como interfaces gráficas de usuário (GUIs), máquinas de estado e processamento de linguagem natural, onde objetos precisam se comportar de forma distinta com base em seu estado atual.

Perguntas Frequentes

  • Quando utilizar o Padrão State?
    Quando um objeto precisa modificar seu comportamento dependendo do seu estado interno.
  • Quais as vantagens do Padrão State?
    Encapsulamento do estado, flexibilidade, reutilização e clareza no código.
  • Como implementar o Padrão State em Java?
    Crie uma interface de Estado, implemente os estados concretos e use um Contexto para delegar as chamadas de método para o estado atual.
  • Quais as classes cruciais no Padrão State?
    Contexto, Estado e Estado Concreto.
  • Como o Padrão State melhora a legibilidade do código?
    Ao separar o comportamento do objeto de sua lógica de estados, o código torna-se mais simples de entender.
  • O Padrão State é adequado para qualquer cenário de design?
    Não, ele é mais adequado quando o comportamento do objeto é determinado principalmente por seu estado.
  • O Padrão State pode ser usado com outros padrões?
    Sim, ele pode ser combinado com padrões como Strategy ou Factory.
  • Existem alternativas ao Padrão State?
    Sim, existem outras abordagens para gerenciar estados, como Máquinas de Estados Finitos e Programação Orientada a Aspectos (AOP).