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