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 выражается и в ФП.
🎓 Источники
- 🎓 Как применять паттерны на примере Mediator и Bridge · 2025-02-01
- Bridge = SRP для иерархий
- Mount как пример Bridge в React-подобной архитектуре
- Bridge выражается и через ФП-контракты
- 🎓 GoF Patterns Обзор всех паттернов · 2025-04-29
- IoT-устройства × транспорты как классический пример
- Bridge vs Mediator: разница в знании об иерархиях