Что такое паттерн проектирования Bridge (Мост)?

«Что такое паттерн проектирования Bridge (Мост)?» — вопрос из категории Паттерны, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 как растровое изображение (пиксели).

Преимущества:

  • Принцип открытости/закрытости: Можно добавлять новые абстракции и реализации, не меняя существующий код.
  • Сокрытие деталей реализации от клиентского кода.
  • Уменьшение связанности между абстракцией и реализацией.