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

Паттерн: Мост (Bridge)

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Зачем нужен паттерн "Мост"?

Представьте, что вы разрабатываете приложение для рисования, которое должно поддерживать различные формы (например, круги и квадраты) и различные платформы (например, Windows и macOS). Без использования паттерна "Мост" вам пришлось бы создавать отдельные классы для каждой комбинации формы и платформы, что быстро приведет к взрывному росту количества классов и усложнению кода.

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

Как работает паттерн "Мост"?

Паттерн "Мост" состоит из двух основных частей:

  1. Абстракция — это интерфейс или абстрактный класс, который определяет высокоуровневую функциональность. Абстракция содержит ссылку на объект реализации.
  2. Реализация — это интерфейс или абстрактный класс, который определяет низкоуровневую функциональность. Конкретные реализации этого интерфейса предоставляют специфические детали.

Вот как это выглядит в коде:

# Интерфейс реализации
class DrawingAPI:
    def draw_circle(self, x, y, radius):
        pass
​
# Конкретная реализация для Windows
class WindowsDrawingAPI(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"Drawing circle on Windows at ({x}, {y}) with radius {radius}")
​
# Конкретная реализация для macOS
class MacOSDrawingAPI(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"Drawing circle on macOS at ({x}, {y}) with radius {radius}")
​
# Абстракция
class Shape:
    def __init__(self, drawing_api):
        self.drawing_api = drawing_api
​
    def draw(self):
        pass
​
# Конкретная абстракция
class Circle(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)
​
# Использование
circle1 = Circle(1, 2, 3, WindowsDrawingAPI())
circle2 = Circle(4, 5, 6, MacOSDrawingAPI())
​
circle1.draw()  # Drawing circle on Windows at (1, 2) with radius 3
circle2.draw()  # Drawing circle on macOS at (4, 5) with radius 6

Где применяется паттерн "Мост"?

Паттерн "Мост" применяется в ситуациях, когда:

  • Необходимо разделить абстракцию и реализацию, чтобы они могли изменяться независимо.
  • Требуется уменьшить количество классов в системе, избегая дублирования кода.
  • Нужно обеспечить гибкость и расширяемость системы, позволяя добавлять новые абстракции и реализации без изменения существующего кода.

Аналогия из реальной жизни

Представьте себе пульт дистанционного управления и телевизор. Пульт — это абстракция, а телевизор — реализация. Вы можете использовать один и тот же пульт для управления разными моделями телевизоров, и наоборот, разные пульты могут управлять одним и тем же телевизором. Паттерн "Мост" позволяет вам менять пульт или телевизор независимо друг от друга, не нарушая работу всей системы.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки