DEV Community

Michel Moreira
Michel Moreira

Posted on

Padrão Composite em Python

O Composite é um padrão de projeto estrutural, ele permite que objetos sejam compostos em estrutura de árvore, esta podendo ser tratada como se fossem objetos individuais.

Exemplo de código em Python

class Component(ABC):

    @property
    def parent(self) -> Component:
        return self._parent

    @parent.setter
    def parent(self, parent: Component):

        self._parent = parent

    def add(self, component: Component) -> None:
        pass

    def remove(self, component: Component) -> None:
        pass

    def is_composite(self) -> bool:

        return False

    @abstractmethod
    def operation(self) -> str:

        pass


class Leaf(Component):

    def operation(self) -> str:
        return "Leaf"


class Composite(Component):

    def __init__(self) -> None:
        self._children: List[Component] = []

    def add(self, component: Component) -> None:
        self._children.append(component)
        component.parent = self

    def remove(self, component: Component) -> None:
        self._children.remove(component)
        component.parent = None

    def is_composite(self) -> bool:
        return True

    def operation(self) -> str:

        results = []
        for child in self._children:
            results.append(child.operation())
        return f"Branch({'+'.join(results)})"
Enter fullscreen mode Exit fullscreen mode

A classe Component descreve as operações que são comuns para todos os elementos. A classe Leaf é um elemento básico que constitui a árvore e não pode ter sub-elementos, desta maneira ficam encarregados do trabalho final uma vez que não tem para quem delegá-lo. A classe Composite é o objeto que vai ter sub-elementos (folhas ou outros composites).
Quando um pedido é feito ele é repassado pelos objetos Composite, processando resultados intermediário, até concluir a requisição e retornar o resultado final.

A implementação em Python não tem nenhuma particularidade em relação a implementação em Java.


Referências
Padrões de Projeto (Diogo Moreira, 2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets, 2020)
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.

Top comments (0)