AULA 16 MÓDULO 5 design patterns ⏱ 60 min

Padrão Strategy + API

Strategy: encapsular algoritmos intercambiáveis. Eliminar if/else crescente. Strategy + HttpClient para notificação via webhook em Java.

StrategyOCPSOLIDinterfacecomposiçãoHttpClientwebhook

O if/else que nunca para de crescer

Você implementa cálculo de frete para Correios. Na próxima sprint entra Jadlog. Depois Loggi. Cada novo método de entrega adiciona um else if na mesma classe. Isso viola o Open/Closed Principle: a classe Pedido nunca para de ser modificada.

💥
o problema real
if (metodo.equals("correios")) { ... } else if (metodo.equals("jadlog")) { ... } else if (metodo.equals("loggi")) { ... }
100 linhas de if/else. Teste unitário impossível. Adicionar transportadora nova = risco de quebrar as existentes.

Padrão Strategy — GOF

Strategy encapsula cada algoritmo em uma classe separada. O contexto recebe a estratégia como dependência e a chama sem saber qual é. Trocar a estratégia = trocar um objeto.

«interface» EstrategiaFrete + calcular(double peso, double dist): double ↑ implements FreteCorreios FreteJadlog FreteLoggi calcular(...) calcular(...) calcular(...) Pedido (contexto) - estrategia: EstrategiaFrete + setEstrategia(e): void + calcularFrete(): double → delega
Open/Closed Principle
Nova transportadora = nova classe que implements EstrategiaFrete. Zero mudança em Pedido, zero risco de regressão. Isso é OCP do SOLID na prática.

Strategy + API de notificação

Combinando padrão Strategy com HttpClient: trocar a estratégia de notificação (email, SMS, webhook) sem mudar o código que a usa.

🌐
conexão com Redes 1
HttpClient POST envia dados pelo protocolo HTTP — a mesma camada de aplicação que você estuda em Redes de Computadores 1. O objeto HttpRequest encapsula o PDU (Protocol Data Unit) da camada de aplicação.
java
// Padrão Strategy — frete e notificação

public interface EstrategiaFrete {
    double calcular(double peso, double distancia);
    String getNome();
}

public class FreteCorreios implements EstrategiaFrete {
    public double calcular(double peso, double dist) {
        return 8.0 + peso * 1.5 + dist * 0.02;
    }
    public String getNome() { return "Correios"; }
}

public class FreteLoggi implements EstrategiaFrete {
    public double calcular(double peso, double dist) {
        return 5.0 + peso * 2.0; // Loggi não cobra por distância
    }
    public String getNome() { return "Loggi"; }
}

// Contexto — não sabe qual estratégia está usando
public class Pedido {
    private EstrategiaFrete estrategia;

    public void setEstrategia(EstrategiaFrete e) { this.estrategia = e; }

    public double calcularFrete(double peso, double dist) {
        if (estrategia == null)
            throw new IllegalStateException("Defina a estratégia de frete");
        return estrategia.calcular(peso, dist); // delega
    }
}

// Strategy + HttpClient — notificação via webhook
public interface ServicoNotificacao {
    void notificar(String mensagem, String destino) throws Exception;
}

public class NotificacaoWebhook implements ServicoNotificacao {
    private final HttpClient client = HttpClient.newHttpClient();

    public void notificar(String mensagem, String url) throws Exception {
        String body = "{\"mensagem\":\"" + mensagem + "\"}";
        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        client.send(req, HttpResponse.BodyHandlers.ofString());
    }
}
quiz · aula 16
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Qual problema o Padrão Strategy resolve?
QUESTÃO 02
O que permite trocar a estratégia de frete em runtime?
QUESTÃO 03
Qual a diferença entre Strategy e Template Method?
0/3