Паттерн "Компоновщик" (Composite) в Java — дерево отдела и единый интерфейс
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Краткий обзор — в структурных паттернах. Здесь — практический Composite на Java для иерархической оргструктуры.
Play ITЗагрузка интерактивного демо…
Задача паттерна
Composite позволяет работать с отдельным объектом и группой объектов одинаково.
Типичный кейс — дерево:
- лист — единичный элемент;
- композит — узел с дочерними элементами;
- клиент использует общий интерфейс и не ветвится по типам.
Пример — структура отдела
Код ITЗагрузка примера кода…
Department dev = new Department("Разработка");
dev.add(new Employee("Анна", 200_000));
dev.add(new Employee("Борис", 180_000));
Department company = new Department("Компания");
company.add(dev);
company.add(new Employee("CEO Иван", 500_000));
System.out.println(company.getSalary()); // 880000
Клиент вызывает getSalary() одинаково и для Employee, и для Department.
Когда использовать
| Сценарий | Composite |
|---|---|
| Файловая система, UI-дерево, меню, оргструктура | Единый интерфейс для листьев и узлов |
| Нужна рекурсивная агрегация метрик | Композит делегирует вычисление детям |
| Клиентский код должен быть простым | Убираются instanceof-ветвления |
Composite и Iterator
Composite описывает структуру, Iterator — обход.
Их часто применяют вместе: структура хранится как дерево Composite, обход выполняется итератором (DFS/BFS). См. Итератор в Java.
Риски
Трудно жестко ограничить допустимые типы дочерних элементов в общем интерфейсе. Проверки состава часто уходят в runtime-валидацию.