Consumer — поведенческий паттерн, инкапсулирующий операцию над переданным объектом.
В Java реализуется через функциональный интерфейс java.util.function.Consumer<T>.
Интерфейс Consumer<T>:
- Принимает входной параметр типа
T; - Выполняет над ним действие;
- Не возвращает результат (
void).
- Инкапсуляция операций — логика обработки отделена от данных;
- Гибкость — легко заменять обработчики;
- Функциональный стиль — совместим с лямбда-выражениями;
- Композиция — позволяет создавать цепочки потребителей.
Object
└── Trash
└── PaperTrash
└── NewspaperTrash
Trash— базовый класс мусора;PaperTrash— бумажный мусор (наследуется отTrash);NewspaperTrash— газеты (наследуется отPaperTrash).
Параметры:
source:List<? extends PaperTrash>— список-источник;destination:List<? super PaperTrash>— список-приемник.
Позволяет копировать любой бумажный мусор (и его подтипы) в любой контейнер, который принимает PaperTrash.
- Реализует
Consumer<Trash>; - Определяет метод
accept()для обработки объектов; - Работает с любыми объектами
Trashи его подклассами.
- Копирование
NewspaperTrashв контейнер типаList<Trash>; - Копирование смешанного
PaperTrashвList<PaperTrash>; - Копирование в контейнер типа
List<Object>; - Обработка мусора через реализацию
Consumer.
- Гибкость
wildcards:? extendsи? super; - Использование
Consumerдля обработки элементов; - Безопасность типов с
generics; - Работа с объектами разного уровня иерархии.
- Нужно применить действие к элементу без возврата результата (forEach, peek).
- Требуется гибкая настройка объектов (Builder, конфигурация).
- Нужно комбинировать операции последовательно (andThen).
- Работаете с Optional (ifPresent).
- Используете колбэки или обработчики событий
