Назад к вопросам
Middle+
69
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Ключевые особенности:

  • Разделение: Отделяет абстрактный класс или интерфейс от его конкретной реализации.
  • Гибкость: Позволяет динамически связывать различные реализации с одной и той же абстракцией.
  • Уменьшение сложности: Предотвращает разрастание иерархий классов, которые возникают при наследовании.

Структура:

  • Абстракция (Abstraction): Определяет интерфейсную часть класса (клиентский интерфейс) и содержит ссылку на реализацию.
  • Расширенная Абстракция (Refined Abstraction): Расширяет Абстракцию, добавляя или модифицируя поведение.
  • Реализация (Implementor): Определяет интерфейс для классов реализации. Не обязательно соответствует Абстракции один к одному.
  • Конкретная Реализация (Concrete Implementor): Реализует интерфейс Реализации.

Пример использования:

Предположим, есть фигуры (круг, квадрат) и рендереры (рисовать на экране, экспортировать в файл). Без Моста пришлось бы создавать классы вида ЭкранныйКруг, ФайловыйКруг, ЭкранныйКвадрат, ФайловыйКвадрат. С Мостом можно иметь классы Круг и Квадрат (Абстракции) и ЭкранныйРендерер и ФайловыйРендерер (Конкретные Реализации), связывая их через интерфейс Реализации.

# Implementor
class DrawingAPI:
    def draw_circle(self, x, y, radius):
        pass

# Concrete Implementor A
class DrawingAPI1(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API1.drawing Circle at ({x}, {y}) with radius {radius}")

# Concrete Implementor B
class DrawingAPI2(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API2.drawing Circle at ({x}, {y}) with radius {radius}")

# Abstraction
class Shape:
    def __init__(self, drawing_api):
        self._drawing_api = drawing_api

    def draw(self):
        pass

    def resize_by_percentage(self, percent):
        pass

# Refined Abstraction
class CircleShape(Shape):
    def __init__(self, x, y, radius, drawing_api):
        super().__init__(drawing_api)
        self._x = x
        self._y = y
        self._radius = radius

    def draw(self):
        self._drawing_api.draw_circle(self._x, self._y, self._radius)

    def resize_by_percentage(self, percent):
        self._radius *= (1 + percent / 100)

# Client code
# api1 = DrawingAPI1()
# api2 = DrawingAPI2()

# circle1 = CircleShape(1, 2, 3, api1)
# circle2 = CircleShape(5, 7, 11, api2)

# circle1.draw()
# circle2.draw()

Данный паттерн полезен, когда нужно избежать жесткой связи между Абстракцией и Реализацией, позволяя им развиваться независимо.