🚀 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".

  1. Escreva a classe da nova estratégia.
  2. 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)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 17 Paradigmas) e clique em Commit to main.
  2. 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.js

9. 💡 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:

  1. Classe:
class Recuar {
    executar() { console.log("Retirar tropas e voltar para a muralha!"); }
}
  1. Aplicação: exercitoStark.definirEstrategia(new Recuar());

Capitulo Anterior | Proximo Capitulo