Где в Java Core применяется паттерн «Декоратор» (Decorator)?

«Где в Java Core применяется паттерн «Декоратор» (Decorator)?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн Декоратор широко применяется в Java Core, прежде всего, в пакетах для ввода-вывода (java.io) и коллекций (java.util). Его суть — динамическое добавление новой функциональности объекту, оборачивая его.

1. Классы java.io (канонический пример) Базовые классы потоков (InputStream, OutputStream, Reader, Writer) декорируются для добавления поведения.

// 1. Базовый компонент — чтение байтов из файла
InputStream fileStream = new FileInputStream("data.bin");

// 2. Декоратор для буферизации (улучшает производительность)
InputStream bufferedStream = new BufferedInputStream(fileStream);

// 3. Декоратор для чтения примитивных типов данных
DataInputStream dataStream = new DataInputStream(bufferedStream);

int value = dataStream.readInt(); // Чтение int через цепочку декораторов

Другие примеры: GZIPInputStream (сжатие), ObjectInputStream (десериализация).

2. Классы java.util.Collections Методы-фабрики создают декорированные («просмотренные») коллекции.

List<String> originalList = new ArrayList<>();
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
// unmodifiableList.add("x"); // Выбросит UnsupportedOperationException

Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
// Декоратор добавляет потокобезопасность

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

  • Гибкость: Комбинации функциональности создаются динамически.
  • Соблюдение OCP: Новый функционал добавляется без изменения существующих классов.
  • Прозрачность: Декоратор имеет тот же интерфейс, что и базовый компонент.