Какой паттерн лежит в основе конструкции new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))?
Decorator: каждая обёртка добавляет один аспект (буферизацию, распаковку) и остаётся тем же InputStream. Комбинацию выбирает клиент во время выполнения — без взрыва числа подклассов.
- Порядок значим: буферизация снаружи даёт крупные чтения из нижних слоёв
- close() внешней обёртки закрывает всю цепочку
- Другие примеры: Collections.unmodifiableList, synchronizedList
А ещё Без декоратора понадобились бы классы BufferedGzipFileInputStream и т. п.
Подробно
Пакет java.io — канонический пример Decorator. Каждая обёртка добавляет один аспект (буферизацию, распаковку), сохраняя интерфейс InputStream, а состав комбинации выбирает клиент в рантайме — это избавляет от комбинаторного взрыва подклассов. Практическая деталь: порядок обёрток значим, буферизацию обычно ставят снаружи.
Что хотят услышать
- Название паттерна и его смысл.
- Почему не наследование.
Частые ошибки
- Путать с Chain of Responsibility: там звено может прервать цепочку, декоратор всегда делегирует дальше.
- Забывать, что Collections.unmodifiableList и synchronizedList — тоже декораторы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Decorator
- ✗Adapter
- ✗Composite
- ✗Chain of Responsibility
Что спросят дальше
- Почему порядок обёрток в java.io имеет значение?
- Чем Decorator отличается от Proxy?
Разбор темы
- Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.