← Назад ко всем вопросам

Что такое шаблон проектирования Adapter

1️⃣ Как кратко ответить

Шаблон проектирования Adapter позволяет объектам с несовместимыми интерфейсами работать вместе. Он действует как мост между двумя несовместимыми интерфейсами, преобразуя интерфейс одного класса в интерфейс, который ожидает другой класс.

2️⃣ Подробное объяснение темы

Шаблон проектирования Adapter, или "Адаптер", используется в объектно-ориентированном программировании для обеспечения взаимодействия между классами с несовместимыми интерфейсами. Это особенно полезно, когда вы хотите использовать существующий класс, но его интерфейс не соответствует вашим требованиям.

Зачем нужен Adapter?

Представьте, что у вас есть два устройства: розетка и вилка. Розетка в стене имеет определенный тип разъема, а вилка вашего устройства — другой. Чтобы подключить устройство к розетке, вам нужен адаптер, который преобразует разъем вилки в разъем, совместимый с розеткой. В программировании Adapter выполняет аналогичную функцию, позволяя объектам с разными интерфейсами работать вместе.

Как работает Adapter?

Adapter работает, создавая новый класс, который оборачивает объект с несовместимым интерфейсом и предоставляет интерфейс, который ожидает клиентский код. Это позволяет клиентскому коду взаимодействовать с объектом через адаптер, не зная о его внутренней реализации.

Пример использования Adapter

Рассмотрим пример, где у нас есть интерфейс MediaPlayer, который может воспроизводить аудиофайлы, и класс AdvancedMediaPlayer, который может воспроизводить как аудио, так и видео. Мы хотим использовать AdvancedMediaPlayer в системе, которая ожидает MediaPlayer.

// Интерфейс, который ожидает клиентский код
interface MediaPlayer {
    void play(String audioType, String fileName);
}
​
// Класс, который мы хотим адаптировать
interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}
​
// Конкретная реализация AdvancedMediaPlayer
class VlcPlayer implements AdvancedMediaPlayer {
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }
​
    public void playMp4(String fileName) {
        // Ничего не делаем
    }
}
​
// Конкретная реализация AdvancedMediaPlayer
class Mp4Player implements AdvancedMediaPlayer {
    public void playVlc(String fileName) {
        // Ничего не делаем
    }
​
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}
​
// Адаптер, который позволяет использовать AdvancedMediaPlayer как MediaPlayer
class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMusicPlayer;
​
    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }
​
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}
​
// Реализация MediaPlayer, использующая адаптер
class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;
​
    public void play(String audioType, String fileName) {
        // Поддержка только mp3 по умолчанию
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        }
        // Используем адаптер для других форматов
        else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}
​
// Пример использования
public class AdapterPatternDemo {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
​
        audioPlayer.play("mp3", "beyond_the_horizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far_far_away.vlc");
        audioPlayer.play("avi", "mind_me.avi");
    }
}

Объяснение кода

  • MediaPlayer: Интерфейс, который ожидает клиентский код. Он определяет метод play, который принимает тип аудио и имя файла.
  • AdvancedMediaPlayer: Интерфейс, который мы хотим адаптировать. Он имеет методы для воспроизведения файлов форматов VLC и MP4.
  • VlcPlayer и Mp4Player: Конкретные реализации AdvancedMediaPlayer, которые могут воспроизводить файлы соответствующих форматов.
  • MediaAdapter: Адаптер, который реализует интерфейс MediaPlayer и использует AdvancedMediaPlayer для воспроизведения файлов. Он определяет, какой тип плеера использовать, и вызывает соответствующий метод.
  • AudioPlayer: Реализация MediaPlayer, которая может воспроизводить MP3-файлы и использует MediaAdapter для воспроизведения других форматов.
  • AdapterPatternDemo: Демонстрация использования AudioPlayer для воспроизведения различных форматов файлов.

Adapter позволяет использовать AdvancedMediaPlayer в системе, которая ожидает MediaPlayer, без изменения существующего кода AdvancedMediaPlayer. Это делает систему более гибкой и расширяемой.

Тема: Паттерны/SOLID
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки