Получить доступ

На каком приёме построено большинство структурных паттернов?

JuniorПаттерны проектирования
Ещё спрашивают так:
  • Чем Decorator отличается от Proxy и Adapter?
  • Какие структурные паттерны вы знаете?
Коротко

Структурные паттерны построены на композиции и делегировании: объект хранит ссылку на другой и пропускает вызовы через себя.

  • Adapter — подогнать интерфейс; Decorator — добавить поведение; Proxy — контролировать доступ
  • Ещё: Facade, Composite, Bridge, Flyweight

А ещё Код у Adapter, Decorator и Proxy похож — различают по намерению

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Большинство структурных паттернов — обёртка вокруг другого объекта. Поэтому они выглядят в коде похоже, и различать их нужно по намерению:

  • 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.

Частые ошибки

  • Пытаться различать эти паттерны по структуре кода, а не по цели.
  • Строить иерархию классов там, где достаточно обёртки.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓На композиции и делегировании: объект хранит ссылку на другой и пропускает вызовы через себя
  • ✗На множественном наследовании классов
  • ✗На рефлексии и динамической генерации классов
  • ✗На использовании статических методов вместо объектов

Что спросят дальше

  • Чем адаптер отличается от декоратора?
  • Где в стандартной библиотеке встречаются декораторы?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем