O Padrão de Estado define diferentes estados para um objeto e atribui comportamentos específicos a cada estado, permitindo que o objeto altere automaticamente seu comportamento quando seu estado interno muda.
Este padrão é um padrão comportamental de objetos que encapsula diferentes comportamentos em estados distintos, seguindo o princípio da "responsabilidade única". Além disso, o Padrão de Estado delimita claramente o comportamento do objeto com base em seu estado atual, reduzindo o acoplamento entre comportamentos e facilitando a expansão e manutenção do sistema.
Em resumo, um objeto de contetxo que possui estados pode apresentar comportamentos diferentes dependendo do estado em que se encontra. Por exemplo, um sistema de atendimento pode estar no estado "disponível" ou no estado "em atendimento". Os principais papéis deste padrão são:
- Contexto (Context): Mantém o estado atual do objeto e dispara mudanças de comportamento quando o estado muda.
- Estado Abstrato (Abstract State): Define uma interface que especifica os comportamentos associados a cada estado do objeto.
- Estado Concreto (Concrete State): Implementa os comportamentos definidos pela interafce de estado abstrato.
Implementação
1) Classe abstrata Estado:
public abstract class Estado {
public abstract void executar(Contexto contexto);
}
2) Subclasse EstadoFerias:
public class EstadoFerias extends Estado {
@Override
public void executar(Contexto contexto) {
System.out.println("Transição para o estado de férias...");
System.out.println("Ações disponíveis nas férias: viajar, compras, assistir filmes...");
}
}
3) Subclasse EstadoTrabalho:
public class EstadoTrabalho extends Estado {
@Override
public void executar(Contexto contexto) {
System.out.println("Transição para o estado de trabalho...");
System.out.println("Ações disponíveis no trabalho: reuniões, projetos, codificação...");
}
}
4) Classe Contexto para gerenciar estados e executar comportamentos:
public class Contexto {
private Estado estado;
public Contexto(Estado estado) {
this.estado = estado;
}
public Estado getEstado() {
return estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
public void executar() {
this.estado.executar(this);
}
}
5) Demonstração do padrão:
public class ExemploTeste {
public static void main(String[] args) {
Contexto contexto = new Contexto(new EstadoTrabalho());
contexto.executar();
contexto.setEstado(new EstadoFerias());
contexto.executar();
}
}
Resultado esperado:
Transição para o estado de trabalho...
Ações disponíveis no trabalho: reuniões, projetos, codificação...
Transição para o estado de fachadas...
Ações disponíveis nas férias: viajar, compras, assistir filmes...