Паттерн "Компоновщик" (Composite) в Java — дерево отдела и единый интерфейс
Краткий обзор — в структурных паттернах. Здесь — практический Composite на Java для иерархической оргструктуры.
Задача паттерна
Composite позволяет работать с отдельным объектом и группой объектов одинаково.
Типичный кейс — дерево:
- лист — единичный элемент;
- композит — узел с дочерними элементами;
- клиент использует общий интерфейс и не ветвится по типам.
Пример — структура отдела
import java.util.ArrayList;
import java.util.List;
interface OrganizationUnit {
String getName();
long getSalary();
}
class Employee implements OrganizationUnit {
private final String name;
private final long salary;
Employee(String name, long salary) {
this.name = name;
this.salary = salary;
}
@Override
public String getName() {
return name;
}
@Override
public long getSalary() {
return salary;
}
}
class Department implements OrganizationUnit {
private final String name;
private final List<OrganizationUnit> units = new ArrayList<>();
Department(String name) {
this.name = name;
}
void add(OrganizationUnit unit) {
units.add(unit);
}
@Override
public String getName() {
return name;
}
@Override
public long getSalary() {
return units.stream().mapToLong(OrganizationUnit::getSalary).sum();
}
}
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-валидацию.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#