Компоновщик - это паттерн упрощающий работ с древовидными структурами, позволяет добавлять новые типы компонентов без изменения кода и поддерживает рекурсивные операции.

Стоит использовать когда нужно представить иерархию объектов в виде дерева. Когда клиенты должны единообразно работать с отдельными объектами и их композициями. Когда нужно поддерживать динамическую иерархию объектов.

Важно что, для простых структур это будет слишком крутой инструмент, а значит невозможно раскрыть весь потенциал и для системы это будет только хуже.

Пример: `from abc import ABC, abstractmethod from typing import List

#Базовый компонент

class FileSystemComponent(ABC): @abstractmethod def display(self, indent: int = 0): pass

#Лист (не имеет детей)

class File(FileSystemComponent): def init(self, name: str): self.name = name

def display(self, indent: int = 0): print(" " * indent + f"📄 {self.name}")

#Композит (может содержать другие компоненты)

class Folder(FileSystemComponent): def init(self, name: str): self.name = name self.children: List[FileSystemComponent] = []

def add(self, component: FileSystemComponent): self.children.append(component)

def remove(self, component: FileSystemComponent): self.children.remove(component)

def display(self, indent: int = 0): print(" " * indent + f"📁 {self.name}") for child in self.children: child.display(indent + 1)

#Использование

root = Folder("Root") documents = Folder("Documents") pictures = Folder("Pictures")

file1 = File("resume.pdf") file2 = File("notes.txt") file3 = File("photo.jpg")

root.add(documents) root.add(pictures)

documents.add(file1) documents.add(file2) pictures.add(file3)

root.display() Вывод: `📁 Root 📁 Documents 📄 resume.pdf 📄 notes.txt 📁 Pictures 📄 photo.jpg #weekofpatterns``