Composite
O Composite é um padrão estrutural utilizado para representar estruturas hierárquicas em forma de árvore.
Ele permite tratar:
- Objetos individuais.
- Grupos de objetos.
Da mesma maneira.
Um exemplo clássico é um sistema de arquivos:
Pasta
├── arquivo.txt
├── imagem.png
└── Documentos
├── contrato.pdf
└── currículo.pdf
Uma pasta contém arquivos e outras pastas.
Interface
Criamos:
interface FileSystemItem {
getSize(): number;
}
Um arquivo é uma folha:
class File
implements FileSystemItem {
constructor(
private size: number
) {}
getSize() {
return this.size;
}
}
Uma pasta é um Composite:
class Folder
implements FileSystemItem {
private items:
FileSystemItem[] = [];
add(item: FileSystemItem) {
this.items.push(item);
}
getSize() {
return this.items.reduce(
(total, item) =>
total + item.getSize(),
0
);
}
}
Podemos criar:
const root =
new Folder();
root.add(
new File(100)
);
root.add(
new File(200)
);
Criamos uma subpasta:
const documents =
new Folder();
documents.add(
new File(500)
);
documents.add(
new File(300)
);
Adicionamos:
root.add(
documents
);
Agora:
console.log(
root.getSize()
);
Resultado:
1100
A pasta calcula automaticamente o tamanho de todos os seus filhos.
Exemplo prático
O Composite é muito útil para:
Menus
Componentes de UI
Sistema de arquivos
Árvores de categorias
Estruturas organizacionais
Documentos
Por exemplo:
Menu
├── Home
├── Produtos
│ ├── Eletrônicos
│ └── Roupas
└── Contato
Tanto Produtos quanto Eletrônicos podem implementar a mesma interface.
Quando usar?
Use Composite quando:
- Você possui estruturas hierárquicas.
- Objetos podem conter outros objetos.
- Quer tratar folhas e grupos da mesma forma.
A ideia principal é:
Permitir tratar objetos individuais e composições de objetos através da mesma interface.