Skip to content

Latest commit

 

History

History
47 lines (33 loc) · 1.8 KB

File metadata and controls

47 lines (33 loc) · 1.8 KB

Паттерн Адаптер

Паттерн Адаптер - структурный.

  • Нужно использовать сторонний класс, интерфейс которого не соответствует ожидаемому.
  • Хотим избежать изменений в существующем коде старой библиотеки (недоступно для модификации).
  • Хотим использовать новый/старый класс, но 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