Что такое Composite и когда его применяют?
Структурные паттерны
Composite строит древовидную структуру «часть — целое» так, что клиент работает с отдельным объектом и группой объектов через один и тот же интерфейс.
Идея
Общий интерфейс Graphic.draw() реализуют и Circle, и Group, хранящая список Graphic. Вызов group.draw() рекурсивно рисует содержимое — клиенту безразлично, лист это или поддерево.
Где применяется
- Файловая система: файл и папка с общими операциями size и delete.
- UI-деревья: виджет и контейнер виджетов.
- Биллинг: счёт и группа счетов, сумма группы — сумма частей.
Нюансы
- Дилемма единообразия и безопасности типов: у листа нет детей — либо
add()есть у всех и бросает исключение в листе, либо интерфейсы разные, что ломает прозрачность. - Обходы дерева естественно ложатся на рекурсию; для тяжёлых деревьев добавляют итераторы и кеши промежуточных сумм.
Коротко для собеседования
Composite позволяет обращаться с листом и группой одинаково: групповая операция просто рекурсивно вызывается у детей. Подходит для любых деревьев вроде файлов, UI и вложенных счетов; главный компромисс — где объявить add(), чтобы не пожертвовать ни прозрачностью, ни безопасностью.