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

«Что такое паттерн Bridge?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Аналогия из DevOps: Представьте систему развёртывания (абстракция), которая может работать с разными провайдерами облачной инфраструктуры (реализация): AWS, Azure, GCP. Bridge позволяет добавить новый провайдер, не переписывая всю логику развёртывания.

Пример на псевдокоде, релевантный для инфраструктуры:

# Реализация: Интерфейс для работы с облачным хранилищем
class CloudStorageProvider:
    def upload(self, data, path):
        pass
    def download(self, path):
        pass

# Конкретные реализации для разных провайдеров
class AWS_S3_Provider(CloudStorageProvider):
    def upload(self, data, path):
        print(f"Uploading {data} to S3 bucket at s3://{path}")
        # Логика вызова AWS SDK

class Azure_Blob_Provider(CloudStorageProvider):
    def upload(self, data, path):
        print(f"Uploading {data} to Azure Blob at https://{path}")
        # Логика вызова Azure SDK

# Абстракция: Сервис резервного копирования
class BackupService:
    def __init__(self, storage_provider: CloudStorageProvider):
        self._provider = storage_provider  # Композиция - 'мост' к реализации

    def create_backup(self, data):
        print("Creating backup...")
        self._provider.upload(data, f"backups/{datetime.now()}.tar.gz")

# Использование
s3_backup = BackupService(AWS_S3_Provider())
s3_backup.create_backup("app_logs")

azure_backup = BackupService(Azure_Blob_Provider())
azure_backup.create_backup("db_dump")

Преимущества в DevOps/архитектуре:

  • Снижение связанности: Код работы с приложением не зависит от кода конкретного облачного API.
  • Расширяемость: Легко добавить поддержку нового провайдера (например, Yandex Cloud), создав новый класс реализации.
  • Тестируемость: Реализацию легко подменить на мок (mock) для unit-тестов.