Сегодня разберём паттерн Composite (Компоновщик) — элегантный способ работы с иерархическими структурами. Суть: работаешь с группой объектов точно так же, как с одним объектом. Проблема: дерево объектов, куча if-ов Делаешь файловый менеджер. Нужно посчитать размер выбранного элемента. Первое решение: function calculateSize(item: File | Folder): number { if (item.type === 'file') { return item.size; } else { let totalSize = 0; for (const child of item.children) { if (child.type === 'file') { totalSize += child.size; } else { totalSize += calculateSize(child); // рекурсия } } return totalSize; } } Проблемы: - Постоянные проверки типа - Разная логика для файлов и папок - Добавишь новый тип — переписывай всё А ведь концептуально файл и папка делают одно — отдают размер. Просто папка суммирует детей. Решение: единый интерфейс interface FileSystemItem { name: string; getSize(): number; } class File implements FileSystemItem { constructor( public name: string, private size: number )
🌲 Паттерн Компоновщик: как работать с деревьями так же просто, как с листьями
25 декабря 202525 дек 2025
2 мин