Что это такое
Паттерн Bridge разделяет одно понятие на два независимых измерения, чтобы они могли меняться отдельно. Фигуры и способы их рисования; сообщения и способы их отправки.
Без моста получается по одному классу на каждую комбинацию — VectorCircle, TextCircle, VectorSquare... — и список разрастается. С мостом одна сторона хранит интерфейс другой стороны: любая фигура работает с любым отрисовщиком.
Пример: фигуры и отрисовщики
2 отрисовщика × 2 фигуры дали бы 4 комбинированных класса. Здесь это один класс Shape плюс 2 класса отрисовщиков, соединённые одним полем-интерфейсом — это и есть мост.
Любая фигура, любой отрисовщик
Одна и та же окружность рисует себя двумя способами просто потому, что хранит разные отрисовщики. Добавление отрисовщика или фигуры добавляет один класс, а не целый ряд комбинаций.
Вывод: программа на TypeScript и захваченный вывод
// Одно измерение: КАК рисовать.
interface Renderer {
draw(name: string): string
}
class VectorRenderer implements Renderer {
draw(name: string): string {
return "рисуем " + name + " плавными векторными линиями"
}
}
class TextRenderer implements Renderer {
draw(name: string): string {
return "рисуем " + name + " текстовыми символами"
}
}
// Другое измерение: ЧТО рисовать. Поле renderer — это мост.
class Shape {
private name: string
private renderer: Renderer
constructor(name: string, renderer: Renderer) {
this.name = name
this.renderer = renderer
}
draw(): string {
return this.renderer.draw(this.name)
}
}
const shapes: Shape[] = [
new Shape("окружность", new VectorRenderer()),
new Shape("окружность", new TextRenderer()),
new Shape("квадрат", new VectorRenderer())
]
for (const shape of shapes) {
console.log(shape.draw())
}
Когда это использовать
Используйте, когда замечаете взрыв комбинаций: каждый новый вид на одной оси вынуждает создавать новые классы на другой. Две независимые оси — разделите их.
Пропустите, когда у одного измерения ровно одна реализация. Мост к одному берегу — это просто пирс.
Плюсы и минусы
Плюсы: обе стороны растут независимо; комбинации получаются бесплатно; каждую сторону можно тестировать отдельно.
Минусы: больше косвенности с самого начала; распознать две оси заранее по-настоящему трудно — слишком раннее разделение создаёт абстракцию, которая никому не нужна.