На каком приёме построено большинство структурных паттернов?
- Чем Decorator отличается от Proxy и Adapter?
- Какие структурные паттерны вы знаете?
Структурные паттерны построены на композиции и делегировании: объект хранит ссылку на другой и пропускает вызовы через себя.
- Adapter — подогнать интерфейс; Decorator — добавить поведение; Proxy — контролировать доступ
- Ещё: Facade, Composite, Bridge, Flyweight
А ещё Код у Adapter, Decorator и Proxy похож — различают по намерению
Подробно
Большинство структурных паттернов — обёртка вокруг другого объекта. Поэтому они выглядят в коде похоже, и различать их нужно по намерению:
- Adapter — подгоняет чужой интерфейс под тот, что нужен клиенту:
Arrays.asListадаптирует массив кList, адаптер к сторонней платёжной библиотеке; - Decorator — добавляет поведение, сохраняя интерфейс:
BufferedInputStreamповерхFileInputStream,Collections.unmodifiableList. Декораторы можно наслаивать; - Proxy — контролирует доступ к объекту с тем же интерфейсом: ленивая загрузка, кэш, проверка прав, транзакции. Spring создаёт прокси для
@Transactionalи@Cacheable; - Facade — простой интерфейс к сложной подсистеме;
- Composite — дерево объектов, с которым работают как с одним объектом (меню, файловая система);
- Flyweight — разделение общих неизменяемых объектов ради памяти (кэш
Integer.valueOf).
Ценность приёма — поведение собирается во время выполнения из готовых частей, а не наследованием с классом на каждую комбинацию.
Пример
InputStream in = new BufferedInputStream( // декоратор: буферизация
new GZIPInputStream( // декоратор: распаковка
new FileInputStream("log.gz")));Что хотят услышать
- Общий механизм: композиция и делегирование.
- Различие Adapter, Decorator, Proxy по намерению.
- Примеры из JDK или Spring.
Частые ошибки
- Пытаться различать эти паттерны по структуре кода, а не по цели.
- Строить иерархию классов там, где достаточно обёртки.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓На композиции и делегировании вызовов
- ✗На множественном наследовании классов через интерфейсы
- ✗На рефлексии и динамической генерации классов
- ✗На использовании статических методов вместо объектов
Что спросят дальше
- Чем адаптер отличается от декоратора?
- Где в стандартной библиотеке встречаются декораторы?
Разбор темы
- Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
Связанные вопросы
- Чем паттерн Proxy отличается от Decorator, если у обоих тот же интерфейс, что и у обёрнутого объекта? Middle
- Какой паттерн реализуют SLF4J и JdbcTemplate по отношению к тому, что они скрывают? Middle
- Что произойдёт при вызове add на списке, полученном из Arrays.asList(array)? Middle
- Spring оборачивает бины в прокси, чтобы работали @Transactional и @Cacheable. Какие практические следствия из этого вытекают? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.