Ответ
Интерфейс java.util.Comparator — это прямая реализация паттерна Strategy (Стратегия).
Суть паттерна: Вынести изменяемый алгоритм (правило сравнения) в отдельный объект, чтобы можно было выбирать и подменять его независимо от клиента, который этот алгоритм использует.
Пример с Comparator:
List<Employee> employees = getEmployees();
// Стратегия 1: Сортировка по имени
Comparator<Employee> byName = Comparator.comparing(Employee::getName);
employees.sort(byName);
// Стратегия 2: Сортировка по зарплате (по убыванию)
Comparator<Employee> bySalaryDesc = Comparator.comparingInt(Employee::getSalary).reversed();
employees.sort(bySalaryDesc);
// Стратегия 3: Композиция стратегий (сначала по отделу, затем по имени)
Comparator<Employee> byDeptThenName =
Comparator.comparing(Employee::getDepartment)
.thenComparing(Employee::getName);
employees.sort(byDeptThenName);
Преимущества такого подхода в контексте Comparator:
- SRP (Single Responsibility Principle): Класс
Employeeне знает о способах своего сравнения. - Открытость/закрытость: Новые правила сортировки добавляются созданием новых классов-стратегий без модификации существующего кода.
- Тестируемость: Стратегию сравнения легко протестировать изолированно.
- Повторное использование: Одна стратегия сравнения может применяться к разным коллекциям.