Назад к вопросам
Junior
197
questionbank

Что такое паттерн 'Адаптер' (Adapter) в программировании?

Sobes Copilot

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

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

sobes.tech AI

Паттерн "Адаптер" (Adapter) преобразует интерфейс одного класса в другой, который ожидает клиент. Он полезен, когда нужно использовать существующий класс, но его интерфейс не соответствует требуемому. Создается класс-обертка (адаптер), который содержит экземпляр адаптируемого класса и реализует требуемый интерфейс, делегируя вызовы соответствующим методам адаптируемого объекта.

Типы адаптеров:

  • Объектный адаптер: Использует композицию. Адаптер содержит ссылку на адаптируемый объект.
  • Классовый адаптер: Использует множественное наследование. Адаптер наследуется как от требуемого интерфейса, так и от адаптируемого класса (менее распространен в Python, так как множественное наследование может быть сложным).

Пример объектного адаптера:

Предположим, у нас есть класс OldSystem, который мы хотим использовать, но его метод называется old_request, а ожидается метод new_request.

// old_system.py
class OldSystem:
    def old_request(self):
        print("Old system request processed.")

// new_interface.py
class NewInterface:
    def new_request(self):
        pass # Abstract method expected by client

// adapter.py
from old_system import OldSystem
from new_interface import NewInterface

class Adapter(NewInterface):
    def __init__(self, old_system):
        self._old_system = old_system

    def new_request(self):
        // Delegate call to the old system's method
        self._old_system.old_request()

// client.py
from old_system import OldSystem
from adapter import Adapter

def client_code(interface):
    interface.new_request()

// Usage
old_system_instance = OldSystem()
adapter_instance = Adapter(old_system_instance)

client_code(adapter_instance)

Применяется для интеграции старых систем с новыми, использования сторонних библиотек с несовместимыми интерфейсами.

Плюсы:

  • Позволяет классам с несовместимыми интерфейсами работать вместе.
  • Улучшает повторное использование кода.
  • Отделяет интерфейс от реализации.

Минусы:

  • Может увеличить количество классов в проекте.
  • Добавляет дополнительный уровень косвенности.