Шаблон адаптера работает как мост между двумя несовместимыми интерфейсами. Этот тип шаблона проектирования подпадает под структурный шаблон, поскольку этот шаблон сочетает в себе возможности двух независимых интерфейсов.
Этот шаблон включает в себя один класс, который отвечает за объединение функций независимых или несовместимых интерфейсов. Примером из реальной жизни может служить устройство для чтения карт памяти, которое служит адаптером между картой памяти и ноутбуком. Вы вставляете карту памяти в кард-ридер и кард-ридер в ноутбук, чтобы ее можно было прочитать через ноутбук.
Мы демонстрируем использование шаблона адаптера на следующем примере, в котором устройство аудиопроигрывателя может воспроизводить только файлы mp3 и хочет использовать усовершенствованный аудиопроигрыватель, способный воспроизводить файлы vlc и mp4.
Реализация
У нас есть интерфейс MediaPlayer и конкретный класс AudioPlayer, реализующий интерфейс MediaPlayer . AudioPlayer может воспроизводить аудиофайлы в формате mp3 по умолчанию.
У нас есть другой интерфейс AdvancedMediaPlayer и конкретные классы, реализующие интерфейс AdvancedMediaPlayer . Эти классы могут воспроизводить файлы формата vlc и mp4.
Мы хотим, чтобы AudioPlayer воспроизводил и другие форматы. Для этого мы создали класс адаптера MediaAdapter, который реализует интерфейс MediaPlayer и использует объекты AdvancedMediaPlayer для воспроизведения требуемого формата.
AudioPlayer использует класс адаптера MediaAdapter, передавая ему нужный тип аудио, не зная фактического класса, который может воспроизводить нужный формат. AdapterPatternDemo , наш демонстрационный класс будет использовать класс AudioPlayer для воспроизведения различных форматов.
Шаг 1
Создайте интерфейсы для Media Player и Advanced Media Player.
MediaPlayer.java
public interface MediaPlayer { public void play(String audioType, String fileName); }
AdvancedMediaPlayer.java
public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
Шаг 2
Создайте конкретные классы, реализующие интерфейс AdvancedMediaPlayer .
VlcPlayer.java
public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //do nothing } }
Mp4Player.java
public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //do nothing } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } }
Шаг 3
Создайте класс адаптера, реализующий интерфейс MediaPlayer .
MediaAdapter.java
public 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(); } } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); } else if(audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } } }
Шаг 4
Создать конкретный класс, реализующий интерфейс MediaPlayer .
AudioPlayer.java
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { //inbuilt support to play mp3 music files if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing mp3 file. Name: " + fileName); } //mediaAdapter is providing support to play other file formats 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"); } } }
Шаг 5
Используйте AudioPlayer для воспроизведения различных типов аудиоформатов.
AdapterPatternDemo.java
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"); } }
Шаг 6
Проверьте вывод.