Ответ
Bridge (Мост) — это структурный паттерн, который разделяет абстракцию и её реализацию на две отдельные иерархии классов, позволяя изменять их независимо друг от друга.
Проблема: Наследование жёстко привязывает реализацию к абстракции. Добавление новой реализации или абстракции требует создания множества классов.
Решение: Bridge заменяет наследование композицией. Абстракция содержит ссылку на объект реализации.
Пример на Swift:
// 1. Иерархия Реализации (Implementor)
protocol Renderer {
func renderCircle(radius: Double)
}
class VectorRenderer: Renderer {
func renderCircle(radius: Double) {
print("Рисую круг радиусом (radius) как векторную графику.")
}
}
class RasterRenderer: Renderer {
func renderCircle(radius: Double) {
print("Рисую круг радиусом (radius) как растровое изображение (пиксели).")
}
}
// 2. Иерархия Абстракции (Abstraction)
class Shape {
let renderer: Renderer
init(renderer: Renderer) {
self.renderer = renderer
}
func draw() {}
}
class Circle: Shape {
var x, y, radius: Double
init(x: Double, y: Double, radius: Double, renderer: Renderer) {
self.x = x
self.y = y
self.radius = radius
super.init(renderer: renderer)
}
override func draw() {
renderer.renderCircle(radius: radius)
}
}
// Использование
let vector = VectorRenderer()
let raster = RasterRenderer()
let circle1 = Circle(x: 0, y: 0, radius: 5, renderer: vector)
circle1.draw() // Рисую круг радиусом 5.0 как векторную графику.
let circle2 = Circle(x: 10, y: 10, radius: 10, renderer: raster)
circle2.draw() // Рисую круг радиусом 10.0 как растровое изображение (пиксели).
Преимущества:
- Принцип открытости/закрытости: Можно добавлять новые абстракции и реализации, не меняя существующий код.
- Сокрытие деталей реализации от клиентского кода.
- Уменьшение связанности между абстракцией и реализацией.