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