🚀 Capítulo 13: Composite (Tema: RPG / Árvore de Talentos)
NOTE
Este capítulo utiliza a temática de RPG para explicar o padrão Composite. Uma habilidade pode ser um golpe simples ou uma árvore inteira de magias; o padrão permite tratar ambos da mesma forma!
1. 🎯 Objetivo da Aula
Compreender o padrão de projeto Composite (Padrão Estrutural), entendendo como ele permite tratar objetos individuais e composições de objetos de maneira uniforme (como uma estrutura de árvore).
2. 🏢 O Cenário Prático (Seu Desafio)
Você está criando o sistema de Árvore de Talentos de um RPG.
- Um talento pode ser uma Habilidade Simples (Ex: “Ataque Forte” que custa 10 pontos).
- Ou pode ser um Ramo de Habilidades (Ex: “Magias de Fogo” que contém “Bola de Fogo”, “Muralha de Chamas” e até outro sub-ramo de “Magias Proibidas”).
O jogador quer saber quantos pontos de talento gastou no total.
- Se for uma habilidade simples, o sistema retorna o custo dela.
- Se for um ramo, o sistema precisa somar o custo de todas as habilidades que estão dentro dele.
O padrão Composite permite que você trate tanto a habilidade simples quanto o ramo da mesma forma, chamando o método calcularCusto(). O próprio ramo se encarrega de perguntar o custo de seus filhos e somar!
Seu desafio é estruturar essa árvore!
3. 🧠 Fundamentos: A Teoria Traduzida
O Composite (Composto) é um padrão de projeto estrutural que permite que você componha objetos em estruturas de árvore e então trabalhe com essas estruturas como se elas fossem objetos individuais.
🌳 Componentes da Árvore:
- Componente (Interface): Declara as operações comuns (Ex:
calcularCusto()). - Folha (Leaf): Objeto simples que não tem filhos (Ex: Habilidade Simples). Ele realmente executa o trabalho.
- Composto (Composite): Objeto que contém filhos (podem ser folhas ou outros compostos). Ele delega o trabalho para seus filhos e resume o resultado.
4. 📖 Exemplo Guiado: Árvore de Talentos (JS)
// Interface comum (conceitual)
class ComponenteTalento {
calcularCusto() {}
}
// FOLHA (Objeto Simples)
class HabilidadeSimples extends ComponenteTalento {
constructor(nome, custo) {
super();
this.nome = nome;
this.custo = custo;
}
calcularCusto() { return this.custo; }
}
// COMPOSTO (Objeto que contém outros)
class RamoDeTalentos extends ComponenteTalento {
constructor(nome) {
super();
this.nome = nome;
this.filhos = [];
}
adicionar(componente) { this.filhos.push(componente); }
calcularCusto() {
// Soma o custo de todos os filhos (recursivamente!)
return this.filhos.reduce((total, filho) => total + filho.calcularCusto(), 0);
}
}
// USO
const ataqueForte = new HabilidadeSimples("Ataque Forte", 10);
const bolaDeFogo = new HabilidadeSimples("Bola de Fogo", 15);
const paredeDeFogo = new HabilidadeSimples("Parede de Fogo", 20);
const ramoFogo = new RamoDeTalentos("Ramo de Fogo");
ramoFogo.adicionar(bolaDeFogo);
ramoFogo.adicionar(paredeDeFogo);
console.log(`Custo do Ataque Forte: ${ataqueForte.calcularCusto()}`); // 10
console.log(`Custo do Ramo de Fogo: ${ramoFogo.calcularCusto()}`); // 35 (15 + 20)5. 🛠️ Prática Obrigatória 1: Ramificando Mais
Com base no exemplo acima, crie mentalmente (ou no código) um novo ramo chamado "Árvore Completa".
- Adicione o
ataqueFortee oramoFogodentro desse novo ramo. - Qual será o resultado de
arvoreCompleta.calcularCusto()?
6. 🛠️ Prática Obrigatória 2: Pastas e Arquivos
Dizemos que o padrão Composite é perfeito para representar o sistema de arquivos do seu computador.
- Nesse sistema, quem seriam as Folhas?
- Quem seriam os Compostos?
- Qual operação comum (método) poderíamos chamar em ambos? (Ex: Calcular tamanho).
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 13 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_13_composite.md
│ └── codigos/
│ └── cap13/
│ └── arvore_talentos.js9. 💡 Checkpoint de Lógica
O padrão Composite usa Recursão por baixo dos panos. Quando o Ramo chama calcularCusto() de um filho que também é um Ramo, o processo se repete até chegar nas Folhas!
10. 🔥 Desafio de Fixação
Pesquise como o padrão Composite é usado em frameworks de interface gráfica (como o HTML/DOM ou o Flutter), onde um componente visual pode conter outros componentes dentro dele.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1: 2. O custo total será 45 (10 do ataque forte + 35 do ramo de fogo). O próprio padrão soma tudo! Gabarito da Prática 2:
- As Folhas seriam os Arquivos (imagens, textos, etc.).
- Os Compostos seriam as Pastas (que podem conter arquivos ou outras pastas).
- Operação comum:
calcularTamanho()oudeletar().