Ответ
Паттерн Декоратор широко применяется в 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: Новый функционал добавляется без изменения существующих классов.
- Прозрачность: Декоратор имеет тот же интерфейс, что и базовый компонент.