Composite
Definição
O padrão Composite permite que objetos individuais e composições de objetos sejam tratados da mesma forma. Ele organiza objetos em estruturas em árvore, onde cada elemento pode ser um componente simples ou um grupo de componentes.
Esse padrão é útil quando você quer que clientes usem uma interface única para lidar com objetos que podem ser simples ou compostos por outros objetos.
Por que é importante
O Composite permite criar estruturas flexíveis e hierárquicas, como menus, arquivos e pastas, ou elementos gráficos, onde componentes podem conter outros componentes.
Ele também facilita o uso de recursão e evita que o código cliente precise saber se está lidando com um objeto simples ou com uma coleção.
Exemplo prático Python)
Vamos criar uma estrutura de diretórios, onde cada item pode ser um
Arquivo
(simples) ou uma Pasta
(que contém
outros itens):
from abc import ABC, abstractmethod
# Componente base
class Item(ABC):
@abstractmethod
def exibir(self, nivel=0):
pass
# Objeto simples
class Arquivo(Item):
def __init__(self, nome):
self.nome = nome
def exibir(self, nivel=0):
print(" " * nivel + f"- Arquivo: {self.nome}")
# Objeto composto
class Pasta(Item):
def __init__(self, nome):
self.nome = nome
self.itens = []
def adicionar(self, item: Item):
self.itens.append(item)
def exibir(self, nivel=0):
print(" " * nivel + f"[Pasta] {self.nome}")
for item in self.itens:
item.exibir(nivel + 1)
Agora podemos criar estruturas aninhadas:
root = Pasta("Documentos")
relatorio = Arquivo("relatorio.pdf")
planilha = Arquivo("dados.xlsx")
subpasta = Pasta("Projetos")
subpasta.adicionar(Arquivo("projeto1.docx"))
subpasta.adicionar(Arquivo("projeto2.docx"))
root.adicionar(relatorio)
root.adicionar(planilha)
root.adicionar(subpasta)
root.exibir()
Com esse padrão, Pasta
e Arquivo
compartilham a
mesma interface e podem ser manipulados de forma uniforme. A lógica
cliente não precisa saber se está lidando com um item simples ou composto.