Что это такое
Паттерн Мост (Bridge) разделяет одно понятие на два независимых измерения, чтобы они могли изменяться отдельно друг от друга. Например, фигуры и способы их рисования; сообщения и способы их отправки.
Без моста для каждой комбинации нужен свой класс — VectorCircle, TextCircle, VectorSquare... — и список быстро растёт. С мостом одна сторона хранит другую в поле: любая фигура работает с любым рендерером.
Пример: фигуры и рендереры
2 рендерера × 2 фигуры дали бы 4 комбинированных класса; здесь их 2 + 2, и они связаны одним полем с типом-протоколом — это и есть мост.
Любая фигура, любой рендерер
Один и тот же круг рисуется двумя способами — достаточно передать ему другой рендерер. Новый рендерер или новая фигура добавляет один класс, а не целый ряд комбинаций.
Вывод: полная программа на Python
from dataclasses import dataclass
from typing import Protocol
# Одно измерение: КАК рисовать.
class Renderer(Protocol):
def draw(self, name: str) -> str: ...
class VectorRenderer:
def draw(self, name: str) -> str:
return "рисуем фигуру " + name + " гладкими векторными линиями"
class TextRenderer:
def draw(self, name: str) -> str:
return "рисуем фигуру " + name + " текстовыми символами"
# Другое измерение: ЧТО рисовать. Поле renderer — это и есть мост.
@dataclass
class Shape:
name: str
renderer: Renderer
def draw(self) -> str:
return self.renderer.draw(self.name)
shapes = [
Shape("circle", VectorRenderer()),
Shape("circle", TextRenderer()),
Shape("square", VectorRenderer()),
]
for s in shapes:
print(s.draw())
Когда использовать
Используйте его, когда замечаете взрывной рост комбинаций: каждый новый вариант на одной оси требует новых классов на другой. Две независимые оси — разделите их.
Не используйте его, когда у одного из измерений ровно одна реализация. Мост к единственному берегу — это просто причал.
Плюсы и минусы
Плюсы: обе стороны развиваются независимо; комбинации получаются бесплатно; каждую сторону можно тестировать отдельно.
Минусы: с самого начала больше косвенности; распознать две оси заранее действительно трудно — слишком раннее разделение создаёт абстракцию, которая никому не нужна.