Какой паттерн проектирования реализует интерфейс Comparator?

«Какой паттерн проектирования реализует интерфейс Comparator?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс 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 не знает о способах своего сравнения.
  • Открытость/закрытость: Новые правила сортировки добавляются созданием новых классов-стратегий без модификации существующего кода.
  • Тестируемость: Стратегию сравнения легко протестировать изолированно.
  • Повторное использование: Одна стратегия сравнения может применяться к разным коллекциям.