Atividade 12: Strategy
Exercício 1: Aplicações
Seção intitulada “Exercício 1: Aplicações”Para cada cenário abaixo, indique se o padrão Strategy é apropriado ou não e justifique em 2–3 frases.
- Uma loja virtual calcula o frete por modalidade (Sedex, PAC, Retirada) e precisa permitir novas modalidades sem alterar o
Checkout. - Um sistema de pagamentos aceita Pix, cartão e boleto, escolhidos pelo cliente no momento da compra, cada um com um fluxo próprio.
- Um jogo de batalha permite ao jogador escolher entre fórmulas de dano diferentes (bruto, crítico, à distância), combináveis com a mesma lógica de combate.
- Uma classe
Relatorioque sempre gera o mesmo PDF, com um formato fixo que nunca muda e sem variações de comportamento. - Uma classe
Pontocom apenasxey, que só soma coordenadas e nunca ganha algoritmos alternativos.
Para cada item, responda:
- “Faz sentido usar Strategy” ou “Não faz sentido usar Strategy”.
- Explique rapidamente o porquê (família de algoritmos intercambiáveis, escolha em runtime, algoritmo único estável, overengineering, etc.).
Exercício 2: Rastreando o anti-pattern em um projeto real
Seção intitulada “Exercício 2: Rastreando o anti-pattern em um projeto real”Baixe o projeto, importe na IDE e rode o Main:
Baixar projeto_strategy_antipattern.zip
É um sistema de vendas (Maven, Java 17) que calcula desconto, frete e
relatório conforme o TipoCliente (COMUM, VIP, CORPORATIVO). O código
funciona, mas repete a decisão de comportamento em vários pontos.
mvn compilejava -cp target/classes br.venson.net.designpatterns.strategy.MainNo Eclipse/IntelliJ, basta importar a pasta do projeto e executar a classe
Main.
Analise o código e responda:
- Localize todas as decisões de comportamento baseadas em
TipoCliente. Quantas classes repetem o mesmoswitch? O que isso indica sobre o design? - O que é preciso alterar para adicionar um novo tipo de cliente (por exemplo,
PARCEIRO)? Liste os arquivos que seriam tocados. - Por que esse código é difícil de testar isoladamente por regra (desconto, frete, formatação)? Como as condicionais atrapalham?
- Proponha uma refatoração com o padrão Strategy, deixando explícitos:
- a interface de estratégia;
- as estratégias concretas;
- o contexto que delega;
- como o
RelatorioPedidopassa a depender apenas da abstração.
- Depois de refatorar, como fica a troca de comportamento em runtime? Dê um exemplo (ex.: aplicar uma regra promocional e depois voltar à padrão).
Entrega: um diagrama de classes (antes/depois), o código refatorado e um parágrafo justificando cada decisão de design.