Паттерн Адаптер - структурный.
- Нужно использовать сторонний класс, интерфейс которого не соответствует ожидаемому.
- Хотим избежать изменений в существующем коде старой библиотеки (недоступно для модификации).
- Хотим использовать новый/старый класс, но API не совпадает.
Tip
Допустим, у нас есть система, которая ожидает работу с интерфейсом нового плеера MediaPlayer.
Но мы хотим подключить стороннюю библиотеку с несовместимым интерфейсом старого плеера OldAudioPlayer.
То есть, мы хотим привести сторонний интерфейс к ожидаемому, не изменяя его код.
from abc import ABC, abstractmethod
class MediaPlayer(ABC):
@abstractmethod
def play(self, filename):
pass
class OldAudioPlayer:
def play_audio_file(self, filepath):
print(f"Воспроизведение через OldAudioPlayer: {filepath}")
class AudioAdapter(MediaPlayer):
def __init__(self, old_player: OldAudioPlayer):
self.old_player = old_player
def play(self, filename):
print("[Адаптер] Преобразуем вызов...")
self.old_player.play_audio_file(filename)
old_player = OldAudioPlayer()
adapter = AudioAdapter(old_player)
adapter.play("song.mp3")
# output:
# [Адаптер] Преобразуем вызов...
# Воспроизведение через OldAudioPlayer: song.mp3