Entwurfsmuster - Adaptermuster
Das Adaptermuster fungiert als Brücke zwischen zwei inkompatiblen Schnittstellen. Diese Art von Entwurfsmuster fällt unter ein Strukturmuster, da dieses Muster die Fähigkeit zweier unabhängiger Schnittstellen kombiniert.
Dieses Muster umfasst eine einzelne Klasse, die für die Verknüpfung von Funktionen unabhängiger oder inkompatibler Schnittstellen verantwortlich ist. Ein Beispiel aus dem wirklichen Leben könnte ein Kartenleser sein, der als Adapter zwischen Speicherkarte und Laptop fungiert. Sie stecken die Speicherkarte in den Kartenleser und den Kartenleser in den Laptop, damit die Speicherkarte über den Laptop gelesen werden kann.
Wir demonstrieren die Verwendung des Adaptermusters anhand des folgenden Beispiels, in dem ein Audio-Player-Gerät nur MP3-Dateien abspielen kann und einen erweiterten Audio-Player verwenden möchte, der VLC- und MP4-Dateien abspielen kann.
Implementierung
Wir haben eine MediaPlayer- Schnittstelle und einen konkreten AudioPlayer , der die MediaPlayer- Schnittstelle implementiert . AudioPlayer kann standardmäßig Audiodateien im MP3-Format abspielen.
Wir haben eine weitere Schnittstelle AdvancedMediaPlayer und konkrete Klassen, die die AdvancedMediaPlayer- Schnittstelle implementieren . Diese Klassen können Dateien im VLC- und MP4-Format abspielen.
Wir möchten, dass AudioPlayer auch andere Formate wiedergibt . Um dies zu erreichen, haben wir eine Adapterklasse MediaAdapter erstellt, die die MediaPlayer- Schnittstelle implementiert und AdvancedMediaPlayer- Objekte verwendet, um das erforderliche Format abzuspielen.
AudioPlayer verwendet die Adapterklasse MediaAdapter, die den gewünschten Audiotyp übergibt, ohne die tatsächliche Klasse zu kennen, die das gewünschte Format wiedergeben kann. AdapterPatternDemo , unsere Demo-Klasse, verwendet die AudioPlayer- Klasse, um verschiedene Formate abzuspielen.
Schritt 1
Erstellen Sie Schnittstellen für Media Player und 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);
}
Schritt 2
Erstellen Sie konkrete Klassen, die die AdvancedMediaPlayer- Schnittstelle implementieren .
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);
}
}
Schritt 3
Erstellen Sie eine Adapterklasse, die die MediaPlayer- Schnittstelle implementiert .
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);
}
}
}
Schritt 4
Erstellen Sie eine konkrete Klasse, die die MediaPlayer- Schnittstelle implementiert .
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");
}
}
}
Schritt 5
Verwenden Sie den AudioPlayer, um verschiedene Arten von Audioformaten abzuspielen.
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");
}
}
Schritt 6
Überprüfen Sie die Ausgabe.
Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported