Какой паттерн проектирования использует интерфейс Comparator в 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() позволяют легко комбинировать несколько правил сортировки.

Ответ 18+ 🔞

А, ну вот, классика жанра, ёпта! Смотри, смотри, этот твой Comparator<T> — это же чистейшей воды Стратегия (Strategy), блядь! Прямо как в учебнике, только в жизни.

А в чём прикол-то, спросишь? А прикол в том, что ты берёшь целый алгоритм — в нашем случае, логику, как один объект с другим сравнивать — и засовываешь его в отдельную коробочку. И эта коробочка становится взаимозаменяемой, как патрон в стволе! Код, который сортирует (Collections.sort() или List.sort()), ему похуй, что там внутри. Его дело — вызвать compare(). А как сравнивать — это уже твои заморочки, твоя стратегия.

Щас на пальцах, блядь:

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

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

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

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

И что мы, блядь, с этого имеем? А имеем мы овердохуищно удобную штуку:

  • Разделили, сука, ответственность: Сам класс String нихуя не знает про сортировки. Он просто строка. А вся ебля с "кто больше" сидит в отдельном компараторе. Красота, блядь!
  • Гибкость на уровне бога: Захотел новое правило сравнения — написал новый компаратор и подсунул его в sort(). Старый код даже не чихнул, он нихуя не менялся! Это и есть тот самый "открыт для расширения, закрыт для изменений", если ты вдруг книжки читаешь.
  • Композиция, ёбана! Это вообще песня. Метод thenComparing() позволяет тебе строить цепочки, как из кубиков. "Сначала сравни по фамилии, а если фамилии одинаковые — ёбни по имени". И всё это — одной строчкой, блядь! Пиздец как удобно.

Вот и весь сказ, блядь. Не какой-то там абстрактный паттерн, а реальный рабочий инструмент, который каждый день юзается. Тургенев бы оценил, наверное, но он про Муму писал, а не про дженерики.