Что это такое
Паттерн Bridge («Мост») разделяет одно понятие на два независимых измерения, чтобы они могли меняться отдельно друг от друга. Фигуры и способы их рисования; сообщения и способы их отправки.
Без моста получается по одному типу на каждую комбинацию — VectorCircle, TextCircle, VectorSquare... — и список разрастается. С мостом одна сторона хранит интерфейс другой стороны: любая фигура работает с любым рендерером.
Пример: фигуры и рендереры
2 рендерера × 2 фигуры дали бы 4 совмещённых типа; здесь их 2 + 2, соединённых одним полем-интерфейсом — это и есть мост.
Любая фигура, любой рендерер
Один и тот же круг рисует себя двумя способами просто потому, что хранит разные рендереры. Добавление рендерера или фигуры добавляет один тип, а не целый ряд комбинаций.
Вывод: программа на Go и захваченный вывод
package main
import "fmt"
// Первое измерение: КАК рисовать.
type Renderer interface {
Draw(name string) string
}
type VectorRenderer struct{}
func (VectorRenderer) Draw(name string) string {
return "рисуем " + name + " плавными векторными линиями"
}
type TextRenderer struct{}
func (TextRenderer) Draw(name string) string {
return "рисуем " + name + " текстовыми символами"
}
// Второе измерение: ЧТО рисовать. Поле renderer и есть мост.
type Shape struct {
name string
renderer Renderer
}
func (s Shape) Draw() string {
return s.renderer.Draw(s.name)
}
func main() {
shapes := []Shape{
{name: "круг", renderer: VectorRenderer{}},
{name: "круг", renderer: TextRenderer{}},
{name: "квадрат", renderer: VectorRenderer{}},
}
for _, s := range shapes {
fmt.Println(s.Draw())
}
}
Когда его использовать
Используйте, когда замечаете взрывной рост комбинаций: каждый новый вид на одной оси заставляет создавать новые типы на другой. Две независимые оси — разделите их.
Не используйте, когда у одного измерения есть ровно одна реализация. Мост к единственному берегу — это просто причал.
Плюсы и минусы
Плюсы: обе стороны развиваются независимо; комбинации получаются бесплатно; каждую сторону можно тестировать отдельно.
Минусы: больше косвенности с самого начала; вовремя распознать две оси по-настоящему трудно — слишком раннее разделение создаёт абстракцию, которая никому не нужна.