Что это
Паттерн «Мост» разделяет одно понятие на два независимых измерения, чтобы они могли меняться отдельно. Фигуры и способы их отрисовки; сообщения и способы их отправки.
Без моста получается по одному классу на каждую комбинацию — VectorCircle, TextCircle, VectorSquare... — и список растёт как произведение. С мостом одна сторона хранит интерфейс к другой: любая фигура работает с любым отрисовщиком.
Пример: фигуры и отрисовщики
2 отрисовщика × 2 фигуры дали бы 4 комбинированных класса; здесь их 2 + 2, связанных одним свойством-интерфейсом — это и есть мост.
Любая фигура, любой отрисовщик
Один и тот же круг рисует себя двумя способами просто потому, что хранит разный отрисовщик. Добавление отрисовщика или фигуры добавляет один класс, а не целый ряд комбинаций.
Вывод: PHP-скрипт
<?php
// Одно измерение: КАК рисовать.
interface Renderer {
public function draw(string $name): string;
}
class VectorRenderer implements Renderer {
public function draw(string $name): string {
return "рисуем " . $name . " плавными векторными линиями";
}
}
class TextRenderer implements Renderer {
public function draw(string $name): string {
return "рисуем " . $name . " текстовыми символами";
}
}
// Другое измерение: ЧТО рисовать. Свойство renderer и есть мост.
class Shape {
public function __construct(
private string $name,
private Renderer $renderer,
) {}
public function draw(): string {
return $this->renderer->draw($this->name);
}
}
$shapes = [
new Shape("circle", new VectorRenderer()),
new Shape("circle", new TextRenderer()),
new Shape("square", new VectorRenderer()),
];
foreach ($shapes as $s) {
echo $s->draw(), "\n";
}
Когда применять
Применяйте, когда замечаете комбинаторный взрыв: каждый новый вид по одной оси требует новых классов по другой. Две независимые оси — разделите их.
Не применяйте, когда у одного измерения ровно одна реализация. Мост к одному берегу — это просто пирс.
Плюсы и минусы
Плюсы: две стороны развиваются независимо; комбинации получаются бесплатно; каждую сторону можно тестировать отдельно.
Минусы: больше косвенности с самого начала; распознать две оси заранее по-настоящему трудно — слишком раннее разделение создаёт абстракцию, которая никому не нужна.