🚀 Capítulo 17: Strategy (Tema: Game of Thrones)
NOTE
Este capítulo utiliza a temática de Game of Thrones para explicar o padrão Strategy. Mudar a estratégia de batalha em tempo de execução sem precisar reconstruir todo o exército é o segredo para vencer a guerra!
1. 🎯 Objetivo da Aula
Compreender o padrão de projeto Strategy (Padrão Comportamental), entendendo como ele permite definir uma família de algoritmos, encapsular cada um deles e torná-los intercambiáveis em tempo de execução.
2. 🏢 O Cenário Prático (Seu Desafio)
O exército da Casa Stark está se preparando para a batalha. O Comandante precisa decidir como atacar:
- Estratégia 1: Ataque Frontal (Bom contra arqueiros).
- Estratégia 2: Cerco (Bom para castelos).
- Estratégia 3: Emboscada Noturna (Bom para exércitos maiores).
Se colocarmos toda essa lógica dentro da classe Exercito com um monte de if/else, a classe vai ficar gigante e difícil de manter. Toda vez que criarmos uma estratégia nova, teremos que mexer na classe do exército.
O padrão Strategy diz: crie uma classe separada para cada estratégia de ataque! O exército apenas guarda qual é a estratégia atual e a executa.
Seu desafio é permitir que o Comandante mude a tática no meio da batalha!
3. 🧠 Fundamentos: A Teoria Traduzida
O Strategy (Estratégia) é um padrão de projeto comportamental que permite que você defina uma família de algoritmos, coloque cada um deles em uma classe separada, e faça os objetos deles intercambiáveis.
🛡️ Composição em vez de Herança
Em vez de criar ExercitoDeEmboscada e ExercitoDeCerco (usando herança), a classe Exercito possui um atributo chamado estrategia. Nós podemos trocar esse atributo por qualquer objeto de estratégia compatível.
4. 📖 Exemplo Guiado: Mudando a Tática (JS)
// AS ESTRATÉGIAS (Algoritmos separados)
class AtaqueFrontal {
executar() { console.log("Avançar com escudos e espadas pela frente!"); }
}
class Emboscada {
executar() { console.log("Atacar pelos flancos durante a noite!"); }
}
// O CONTEXTO (O Exército)
class Exercito {
constructor() {
this.estrategia = null; // Começa sem estratégia
}
definirEstrategia(estrategia) {
this.estrategia = estrategia;
}
atacar() {
if (!this.estrategia) {
console.log("Aguardando ordens do Comandante...");
return;
}
this.estrategia.executar();
}
}
// USO
const exercitoStark = new Exercito();
// Definindo a estratégia de Emboscada
exercitoStark.definirEstrategia(new Emboscada());
exercitoStark.atacar(); // "Atacar pelos flancos durante a noite!"
// Mudou o tempo ou o inimigo? Mudamos a estratégia!
exercitoStark.definirEstrategia(new AtaqueFrontal());
exercitoStark.atacar(); // "Avançar com escudos e espadas pela frente!"5. 🛠️ Prática Obrigatória 1: Criando uma Nova Tática
Com base no exemplo acima, queremos adicionar a estratégia de "Recuar".
- Escreva a classe da nova estratégia.
- Como o Comandante aplicaria essa nova tática ao
exercitoStark?
6. 🛠️ Prática Obrigatória 2: Strategy nos Meios de Pagamento
Dizemos que o Strategy é perfeito para sistemas de e-commerce que aceitam várias formas de pagamento (Boleto, Cartão, Pix). Explique quem seria o Contexto (Exército) e quem seriam as Estratégias nesse caso.
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 17 Paradigmas) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_10_paradigmas_e_padroes_de_projeto/
├── capitulos/
│ ├── capitulo_17_strategy.md
│ └── codigos/
│ └── cap17/
│ └── taticas_batalha.js9. 💡 Checkpoint de Lógica
O padrão Strategy permite que você adicione novas estratégias sem alterar nenhuma linha de código das estratégias antigas ou da classe Exercito. Isso segue o Princípio Aberto/Fechado!
10. 🔥 Desafio de Fixação
Pesquise como o padrão Strategy se relaciona com o conceito de Injeção de Dependência.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- Classe:
class Recuar {
executar() { console.log("Retirar tropas e voltar para a muralha!"); }
}- Aplicação:
exercitoStark.definirEstrategia(new Recuar());