Composite — это структурный паттерн, который позволяет сгруппировать объекты в древовидную структуру и работать с ней так же, как с единичным объектом.
Простыми словами: файл и папка с файлами обрабатываются одинаково — у обоих можно спросить размер, удалить, переместить.
▪️ Пример:
Структура отдела в компании: сотрудник и команда состоят в одной иерархии. Нужно посчитать общую зарплату по любой ветке.
// Общий интерфейс
interface OrganizationUnit {
String getName();
long getSalary();
}
// Лист — отдельный сотрудник
class Employee implements OrganizationUnit {
private final String name;
private final long salary;
public Employee(String name, long salary) {
this.name = name;
this.salary = salary;
}
public String getName() { return name; }
public long getSalary() { return salary; }
}
// Композит — отдел, содержит другие элементы
class Department implements OrganizationUnit {
private final String name;
private final List<OrganizationUnit> units = new ArrayList<>();
public Department(String name) {
this.name = name;
}
public void add(OrganizationUnit unit) {
units.add(unit);
}
public String getName() { return name; }
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
▪️ Когда использовать
— Данные образуют древовидную структуру (файловая система, меню, оргструктура)
— Клиентский код должен одинаково работать с простыми и составными объектами
▪️ Минус
Трудно ограничить типы компонентов внутри композита — приходится проверять в runtime.
🐸 Библиотека собеса по Java
#patterns