Что такое паттерн проектирования 'Мост' (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()
Данный паттерн полезен, когда нужно избежать жесткой связи между Абстракцией и Реализацией, позволяя им развиваться независимо.