AULA 07 MÓDULO 2 padrão State ⏱ 90 min

Máquinas de Estado → Padrão State

Do FSM (Sistemas Digitais) ao Padrão State GOF. Diagrama PlantUML. Três implementações progressivas: if/else → Map → classes de estado.

FSMPadrão StateinterfacecontextoPlantUMLOCPdiagrama de estados

Máquinas de Estados — você já viu isso

Em Sistemas Digitais você estudou FSM (Finite State Machine): flip-flops, tabela de transições, diagrama de estados. Um semáforo no hardware é uma FSM. Hoje vamos implementar a mesma ideia em software Java — e evoluir para um padrão de projeto profissional.

🎓
conexão com Sistemas Digitais
FSM formal: Q (estados), Σ (entradas), δ (função de transição), q0 (estado inicial), F (estados finais). O semáforo tem Q={VERDE,AMARELO,VERMELHO}, Σ={tempo}, δ define a sequência. Você modelou isso com circuitos — hoje modelamos com classes.
DEFINIÇÃO FORMAL — SEMÁFORO
Q = { VERDE, AMARELO, VERMELHO }
Σ = { tempo }
q₀ = VERMELHO (estado inicial)
δ = VERMELHO→tempo→VERDE, VERDE→tempo→AMARELO, AMARELO→tempo→VERMELHO

Progressão: 3 implementações

Vamos implementar o mesmo semáforo de três formas, cada uma mais evoluída — e entender por que cada evolução existe.

1
Implementação 1: if/else — Estado em variável String, transições com if/else. Funciona mas não escala: 10 estados = if/else monstruoso.
2
Implementação 2: Map de transições — Estado em Map. Elimina if/else. Ainda mistura comportamento com transição.
3
PlantUML: diagrama antes do código — Visualizar o diagrama no plantuml.com antes de codificar Padrão State.
4
Implementação 3: Padrão State (GOF) — Cada estado é uma classe. Comportamento fica no estado. Aberto para extensão, fechado para modificação.

Padrão State em Java

No Padrão State cada estado é uma classe que implementa uma interface comum. O objeto principal (contexto) delega ao estado atual — sem saber qual é.

«interface» EstadoSemaforo + mudar(Semaforo ctx): void + exibir(): void ↑ implements Verde Amarelo Vermelho mudar→Amarelo mudar→Verm. mudar→Verde Semaforo (contexto) - estado: EstadoSemaforo + setEstado(e): void + mudar(): void → delega ao estado
Open/Closed Principle
Para adicionar estado NOTURNO: crie a classe Noturno, sem tocar em nenhuma classe existente. Isso é o OCP (SOLID) em ação.
java
// Padrão State — Semáforo com 3 estados

// Interface — contrato que todos os estados implementam
public interface EstadoSemaforo {
    void mudar(Semaforo ctx);
    String exibir();
}

// Cada estado é uma classe — comportamento encapsulado
public class Verde implements EstadoSemaforo {
    public void mudar(Semaforo ctx) { ctx.setEstado(new Amarelo()); }
    public String exibir() { return "🟢 VERDE — pode passar"; }
}
public class Amarelo implements EstadoSemaforo {
    public void mudar(Semaforo ctx) { ctx.setEstado(new Vermelho()); }
    public String exibir() { return "🟡 AMARELO — atenção"; }
}
public class Vermelho implements EstadoSemaforo {
    public void mudar(Semaforo ctx) { ctx.setEstado(new Verde()); }
    public String exibir() { return "🔴 VERMELHO — pare"; }
}

// Contexto — delega ao estado atual sem saber qual é
public class Semaforo {
    private EstadoSemaforo estado = new Vermelho();

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

    public void mudar() {
        estado.mudar(this); // delega — não sabe qual estado é
        System.out.println(estado.exibir());
    }
}

// ✦ PlantUML para gerar o diagrama (cole em plantuml.com):
// @startuml
// [*] --> VERMELHO
// VERMELHO --> VERDE : tempo
// VERDE --> AMARELO : tempo
// AMARELO --> VERMELHO : tempo
// @enduml
quiz · aula 07
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Em Sistemas Digitais você estudou FSM. O Padrão State é análogo porque...
QUESTÃO 02
Qual a vantagem do Padrão State sobre if/else para máquina de estados?
QUESTÃO 03
O 'contexto' no Padrão State tem qual responsabilidade?
0/3