Вопрос с собеседования · Java

Какой паттерн лежит в основе конструкции new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))?

MiddleПаттерны проектирования
Коротко

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?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования