PassFront
  1. PassFront
  2. База знаний
  3. Структурные паттерны

Что такое паттерн Bridge и чем он отличается от Adapter?

Структурные паттерны

Bridge заранее разделяет абстракцию и реализацию на две независимые иерархии, связанные композицией; Adapter задним числом подгоняет уже существующий несовместимый интерфейс под ожидаемый.

Bridge

  • Проблема: две оси изменений — вид уведомления (обычное, срочное) × канал (email, SMS, push). Наследованием это 2 × 3 = 6 классов, и каждая новая ось умножает их число.
  • Решение: абстракция хранит ссылку на реализацию и делегирует ей — N + M классов вместо N × M.
  • Закладывается при проектировании.

Adapter

  • Проблема: есть готовый класс (SDK, легаси) с чужим интерфейсом.
  • Решение: обёртка переводит вызовы, исходный класс не трогаем.
  • Применяется постфактум, когда интерфейсы уже зафиксированы.
/** Контракт реализации Channel: send(to, text) */
class EmailChannel {
  send(to, text) { console.log(`mail ${to}: ${text}`); }
}
class SmsChannel {
  send(to, text) { console.log(`sms ${to}: ${text}`); }
}
class Notice { // абстракция: хранит ссылку на реализацию
  constructor(channel) { this.channel = channel; }
  notify(to, msg) { throw new Error('not implemented'); }
}
class UrgentNotice extends Notice {
  notify(to, msg) { this.channel.send(to, `[СРОЧНО] ${msg}`); }
}
new UrgentNotice(new SmsChannel()).notify('+7900', 'Сервер упал');

Коротко для собеседования

Bridge закладывают на этапе проектирования, чтобы две оси изменений жили в отдельных иерархиях и давали N + M классов вместо N × M. Adapter же — заплатка постфактум для чужого интерфейса; от Strategy Bridge отличается масштабом: расщепляет целую иерархию, а не один алгоритм.

Другие вопросы раздела