По какому признаку проще всего отличить Adapter от Decorator и Proxy?
По интерфейсу: адаптер меняет интерфейс (InputStreamReader превращает байтовый поток в символьный), декоратор и прокси сохраняют его. Механизм у всех трёх один — композиция и делегирование, различие в намерении.
- Адаптер — совместимость
- Декоратор — добавить поведение, клиент собирает цепочку
- Прокси — управлять доступом: ленивость, права, транзакции
А ещё Фасад тоже обёртка, но над целой подсистемой
Подробно
Механизм у всех трёх один — композиция и делегирование, поэтому различать надо по намерению. Адаптер решает задачу совместимости: интерфейс на выходе отличается от интерфейса обёрнутого объекта (InputStreamReader превращает байтовый поток в символьный). Декоратор сохраняет интерфейс и добавляет поведение (BufferedInputStream). Прокси сохраняет интерфейс и контролирует доступ (Hibernate lazy loading, Spring AOP).
Что хотят услышать
- Критерий интерфейса.
- Намерение каждого.
Частые ошибки
- Различать эти паттерны по коду, а не по намерению — код у них похож.
- Считать, что адаптер обязательно использует наследование: обычно это тоже композиция.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Адаптер меняет интерфейс, а декоратор и прокси его сохраняют
- ✗Адаптер использует наследование, а декоратор и прокси — композицию
- ✗Адаптер создаётся во время компиляции, а остальные — в рантайме
- ✗Адаптер может обернуть только один объект, остальные — несколько
Что спросят дальше
- Чем прокси отличается от декоратора, если интерфейс у обоих одинаковый?
- К какому паттерну относится Arrays.asList?
Разбор темы
- Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
Связанные вопросы
- Какой паттерн лежит в основе конструкции new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))? Middle
- Чем паттерн Proxy отличается от Decorator, если у обоих тот же интерфейс, что и у обёрнутого объекта? Middle
- Что произойдёт при вызове add на списке, полученном из Arrays.asList(array)? Middle
- На каком приёме построено большинство структурных паттернов? Junior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.