← Назад к вопросам

Что такое паттерн Bridge?

2.0 Middle🔥 181 комментариев
#CI/CD и инструменты разработки#Soft Skills и карьера

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Bridge: разделение абстракции и реализации

Паттерн Bridge (Мост) — это структурный паттерн проектирования, который разделяет один или несколько классов на две отдельные иерархии: абстракцию и реализацию, позволяя изменять их независимо друг от друга.

Основная идея и проблема

Представьте, что у вас есть класс Фигура с подклассами Круг и Квадрат, и вам нужно добавить поддержку разных цветов. Без Bridge вы создадите комбинации вроде КрасныйКруг, СинийКвадрат и т.д. При добавлении нового цвета или формы количество классов растет экспоненциально.

Bridge решает эту проблему, разделяя:

  • Абстракцию (формы)
  • Реализацию (цвета)

Структура паттерна

// 1. Реализация (Implementor)
protocol Color {
    func applyColor() -> String
}

// Конкретные реализации
class RedColor: Color {
    func applyColor() -> String {
        return "красный"
    }
}

class BlueColor: Color {
    func applyColor() -> String {
        return "синий"
    }
}

// 2. Абстракция (Abstraction)
class Shape {
    let color: Color
    
    init(color: Color) {
        self.color = color
    }
    
    func draw() -> String {
        fatalError("Метод должен быть переопределен")
    }
}

// Уточненная абстракция (Refined Abstraction)
class Circle: Shape {
    override func draw() -> String {
        return "Рисую круг \(color.applyColor()) цвета"
    }
}

class Square: Shape {
    override func draw() -> String {
        return "Рисую квадрат \(color.applyColor()) цвета"
    }
}

// 3. Использование
let redColor = RedColor()
let blueColor = BlueColor()

let redCircle = Circle(color: redColor)
print(redCircle.draw()) // "Рисую круг красного цвета"

let blueSquare = Square(color: blueColor)
print(blueSquare.draw()) // "Рисую квадрат синего цвета"

Ключевые преимущества Bridge

  • Принцип единой ответственности: Абстракция и реализация изменяются независимо
  • Открытость/закрытость: Можно добавлять новые реализации без изменения абстракции
  • Избегание "взрыва" подклассов: Вместо создания комбинаций N×M классов, имеем N+M
  • Уменьшение связанности: Абстракция знает только о интерфейсе реализации, но не о конкретных классах

Отличие от других паттернов

  • В отличие от Adapter: Bridge проектируется заранее для разделения абстракций, а Adapter используется для совместимости уже существующих интерфейсов
  • В отличие от Strategy: Strategy меняет поведение объекта, а Bridge разделяет абстракцию и реализацию на архитектурном уровне

Практическое применение в iOS

  1. UI-компоненты с разными темами
protocol Theme {
    var backgroundColor: UIColor { get }
    var textColor: UIColor { get }
}

class DarkTheme: Theme {
    var backgroundColor: UIColor { .black }
    var textColor: UIColor { .white }
}

class LightTheme: Theme {
    var backgroundColor: UIColor { .white }
    var textColor: UIColor { .gray }
}

class UIViewComponent {
    let theme: Theme
    
    init(theme: Theme) {
        self.theme = theme
    }
    
    func applyTheme() {
        // Применяем тему к компоненту
    }
}
  1. Кроссплатформенные приложения с разными реализациями для iOS и Android
  2. Поддержка разных API-версий или протоколов связи
  3. Разделение бизнес-логики и механизмов хранения данных

Заключение

Bridge особенно полезен при разработке сложных систем, где требуется гибкость и масштабируемость. В iOS-разработке он помогает создавать поддерживаемый код, упрощает тестирование и позволяет независимо развивать интерфейсы и их реализации. Паттерн становится особенно ценным при работе над крупными проектами, где требования к разным аспектам системы могут меняться независимо друг от друга.