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

По какому признаку проще всего отличить Adapter от Decorator и Proxy?

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

По интерфейсу: адаптер меняет интерфейс (InputStreamReader превращает байтовый поток в символьный), декоратор и прокси сохраняют его. Механизм у всех трёх один — композиция и делегирование, различие в намерении.

  • Адаптер — совместимость
  • Декоратор — добавить поведение, клиент собирает цепочку
  • Прокси — управлять доступом: ленивость, права, транзакции

А ещё Фасад тоже обёртка, но над целой подсистемой

Подробно

Механизм у всех трёх один — композиция и делегирование, поэтому различать надо по намерению. Адаптер решает задачу совместимости: интерфейс на выходе отличается от интерфейса обёрнутого объекта (InputStreamReader превращает байтовый поток в символьный). Декоратор сохраняет интерфейс и добавляет поведение (BufferedInputStream). Прокси сохраняет интерфейс и контролирует доступ (Hibernate lazy loading, Spring AOP).

Что хотят услышать

  • Критерий интерфейса.
  • Намерение каждого.

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

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

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

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

Показать варианты и ответ
  • ✓Адаптер меняет интерфейс, а декоратор и прокси его сохраняют
  • ✗Адаптер использует наследование, а декоратор и прокси — композицию
  • ✗Адаптер создаётся во время компиляции, а остальные — в рантайме
  • ✗Адаптер может обернуть только один объект, остальные — несколько

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

  • Чем прокси отличается от декоратора, если интерфейс у обоих одинаковый?
  • К какому паттерну относится Arrays.asList?

Разбор темы

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

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

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

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

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