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

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

Ответ

Интерфейс Comparator<T> — это классическая реализация паттерна Strategy (Стратегия).

Почему Strategy? Паттерн инкапсулирует алгоритм (в данном случае — логику сравнения двух объектов) в отдельный класс, делая его взаимозаменяемым независимо от клиентского кода, который его использует (например, Collections.sort()).

Пример:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// Стратегия №1: Сравнение по длине строки
Comparator<String> byLength = (a, b) -> a.length() - b.length();
names.sort(byLength); // ["Bob", "Alice", "Charlie"]

// Стратегия №2: Сравнение в обратном алфавитном порядке
Comparator<String> reverseAlphabetical = (a, b) -> b.compareTo(a);
names.sort(reverseAlphabetical); // ["Charlie", "Bob", "Alice"]

Преимущества такого подхода:

  • Разделение ответственности: Класс данных (String) не содержит логики сравнения.
  • Гибкость и расширяемость: Новые стратегии сравнения добавляются без изменения существующего кода (принцип Open/Closed).
  • Композиция стратегий: Методы Comparator.thenComparing() позволяют легко комбинировать несколько правил сортировки.