В чем разница адаптера и бриджа в паттернах проектирования
Что проверяют
Умеете ли вы различать паттерны по намерению, а не по диаграмме классов: структурно оба оборачивают один объект другим и делегируют ему вызовы. Следом обычно просят пример из Android-кода и спрашивают, чем Адаптер отличается от Декоратора или Фасада.
Как отвечать
Главное различие в цели и в моменте, когда паттерн появляется:
- Адаптер: решает проблему, которая уже случилась. Есть готовый класс с неподходящим интерфейсом (сторонний SDK, legacy-код), и вы пишете прослойку, которая переводит один интерфейс в другой. Исходный класс при этом не меняется;
- Бридж (Мост): закладывается заранее, на этапе проектирования. Иерархия абстракций и иерархия реализаций разводятся и связываются композицией, чтобы вместо N×M подклассов получить N+M классов.
Примеры из Android. Адаптер: обёртка над SDK аналитики или платёжным SDK, которая реализует ваш интерфейс AnalyticsTracker, чтобы остальной код не знал про конкретного вендора. Стоит оговорить, что RecyclerView.Adapter лишь отчасти похож на классический паттерн: он связывает данные с ViewHolder, а не переводит один интерфейс в другой. Хорошо, если скажете это сами.
Бридж: абстракция Notifier с наследниками «срочное» и «дайджест» держит ссылку на интерфейс NotificationChannel, у которого реализации для push через FCM, e-mail и SMS. Новый канал или новый тип уведомления добавляется независимо, без взрыва числа классов.
Короткая формула: Адаптер делает несовместимое совместимым постфактум, Бридж не даёт двум осям изменений перемножиться.
Где спотыкаются
Отвечают по структуре: «оба содержат ссылку на другой объект». Это верно, но разница именно в намерении и в том, на каком этапе паттерн появляется в коде.
Называют RecyclerView.Adapter каноническим Адаптером из книги GoF без всяких оговорок. Интервьюер часто цепляется именно за это.
Приводят для Бриджа пример с «плоской и 3D-кнопкой», не показав двух независимых иерархий. Без двух осей изменений это просто полиморфизм или Стратегия.