Компоновщик - это паттерн упрощающий работ с древовидными структурами, позволяет добавлять новые типы компонентов без изменения кода и поддерживает рекурсивные операции.
Стоит использовать когда нужно представить иерархию объектов в виде дерева. Когда клиенты должны единообразно работать с отдельными объектами и их композициями. Когда нужно поддерживать динамическую иерархию объектов.
Важно что, для простых структур это будет слишком крутой инструмент, а значит невозможно раскрыть весь потенциал и для системы это будет только хуже.
Пример: `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``