Что такое шаблон проектирования 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. Это делает систему более гибкой и расширяемой.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться