PassFront
  1. PassFront
  2. База знаний
  3. Структурные паттерны

Что такое Composite и когда его применяют?

Структурные паттерны

Composite строит древовидную структуру «часть — целое» так, что клиент работает с отдельным объектом и группой объектов через один и тот же интерфейс.

Идея

Общий интерфейс Graphic.draw() реализуют и Circle, и Group, хранящая список Graphic. Вызов group.draw() рекурсивно рисует содержимое — клиенту безразлично, лист это или поддерево.

Где применяется

  • Файловая система: файл и папка с общими операциями size и delete.
  • UI-деревья: виджет и контейнер виджетов.
  • Биллинг: счёт и группа счетов, сумма группы — сумма частей.

Нюансы

  • Дилемма единообразия и безопасности типов: у листа нет детей — либо add() есть у всех и бросает исключение в листе, либо интерфейсы разные, что ломает прозрачность.
  • Обходы дерева естественно ложатся на рекурсию; для тяжёлых деревьев добавляют итераторы и кеши промежуточных сумм.

Коротко для собеседования

Composite позволяет обращаться с листом и группой одинаково: групповая операция просто рекурсивно вызывается у детей. Подходит для любых деревьев вроде файлов, UI и вложенных счетов; главный компромисс — где объявить add(), чтобы не пожертвовать ни прозрачностью, ни безопасностью.

Другие вопросы раздела