Bridge Pattern — Мост

Разделяет 2+ иерархии наследования, чтобы они менялись независимо. Это SRP на уровне иерархий.

Проблема

Есть комбинаторный взрыв при пересечении двух свойств в наследовании. Пример: IoT-устройства (лампа, термостат, датчик) × транспорты (MQTT, HTTP, WebSocket) = 9 классов. Добавить устройство — +3 класса. Добавить транспорт — +3 класса.

Решение

Вместо пересечения в одной иерархии — композиция двух иерархий:

  • Устройство ссылается на транспорт через поле
  • Иерархия устройств растёт независимо от иерархии транспортов
  • Декартово произведение работает без правок

Пример в JS

// иерархия 1: транспорт
class Transport { send(cmd) { throw new Error('abstract'); } }
class MQTT extends Transport { send(cmd) { /* MQTT-логика */ } }
class HTTP extends Transport { send(cmd) { /* HTTP-логика */ } }

// иерархия 2: устройство
class Device {
  constructor(transport) { this.transport = transport; }
  send(cmd) { this.transport.send(cmd); }
}
class Lamp extends Device { turnOn { this.send('on'); } }
class Thermostat extends Device { setTemp(t) { this.send(`temp:${t}`); } }

// комбинация без новых классов
const lamp = new Lamp(new MQTT);
const therm = new Thermostat(new HTTP);

В функциональном стиле:

// Mount — это Bridge между Renderer и Application
const mount = (renderer, app, options) => {
  const el = renderer(app.nodes);
  options.target.appendChild(el);
};

Где используется в JS-экосистеме

  • React + рендерер: react-dom, react-native, react-three-fiber — Bridge
  • Vue render functions + DOM/SSR — Bridge
  • Database ORM + диалект SQL (Postgres, MySQL) — Bridge
  • Cross-platform: бизнес-логика отделена от транспорта/UI

Подводные камни

  • Bridge vs Strategy: Bridge — разделение иерархий на этапе дизайна; Strategy — выбор одного из алгоритмов в рантайме.
  • Bridge vs Mediator: Bridge знает об иерархиях, связывает их по контракту; Mediator не знает об иерархиях, централизует связи между объектами.
  • Bridge vs Abstract Factory: Abstract Factory создаёт семейства; Bridge связывает уже созданные иерархии.
  • Часто избыточен в простых системах — внедряют до того, как появляется реальный комбинаторный взрыв.

Главные тезисы автора

  • «Bridge — это SRP на уровне иерархии классов».
  • «Связка двух деревьев»: одна иерархия — рендереры, другая — крепления (mount).
  • Слабое зацепление: каждая реализация заменяется независимо.
  • На функциональном языке: зацепление двух контрактов через функцию.
  • «Читаю книгу по ООП, а вижу шире, чем ООП» — Bridge выражается и в ФП.

🎓 Источники

См. также