Java adapter design pattern

Dictionary meaning of Adapter: A device for connecting pieces of equipment that cannot be connected directly.

Java adapter design pattern comes under structural design patterns and it provides the facility of communication between two incompatible objects.

Main use of adapter design pattern is in the situations when we need an existing functionality but with some other incompatible object.

Let’s discuss adapter design pattern with below example. MediaPlayer and AdvancedMediaPlayer are two incompatible interfaces. MediaPlayer can run audio files. AdvancedMediaPlayer can run vlc and mp4 format files. MP3Player class implements MediaPlayer interface. VLCPlayer and MP4Player implements AdvancedMediaPlayer. We want MP3Player to run mp4 or some other format. We can achieve this with adapter design pattern. We will create a MediaPlayerAdapter which will be act as an adapter between MediaPlayer and AdvancedMediaPlayer.

Example

MediaPlayer.java

package com.w3schools;
 
public interface MediaPlayer {
	public void play(String filename);
}

AdvancedMediaPlayer.java

package com.w3schools;
 
public interface AdvancedMediaPlayer {
	public void playFile(String filename);
}

MP3Player.java

package com.w3schools;
 
public class MP3Player implements MediaPlayer {
	@Override
	public void play(String filename) {
		System.out.println("Playing MP3 file " + filename);		
	}
}

MP4Player.java

package com.w3schools;
 
public class MP4Player implements AdvancedMediaPlayer {
	@Override
	public void playFile(String filename) {
		System.out.println("Playing MP4 file " + filename);		
	}
}

VLCPlayer.java

package com.w3schools;
 
public class VLCPlayer implements AdvancedMediaPlayer {
	@Override
	public void playFile(String filename) {
		System.out.println("Playing VLC file " + filename);		
	}
}

MediaPlayerAdapter.java

package com.w3schools;
 
public class MediaPlayerAdapter implements MediaPlayer {
	 private AdvancedMediaPlayer advancedMediaPlayer;
	 public MediaPlayerAdapter(AdvancedMediaPlayer advancedMediaPlayer) {
	    this.advancedMediaPlayer = advancedMediaPlayer;
	 }
	 @Override
	 public void play(String filename) {
	   System.out.print("Using MediaPlayerAdapter - ");
	   advancedMediaPlayer.playFile(filename);
	 }
}

AdapterPatternTest.java

package com.w3schools;
 
public class AdapterPatternTest {
	public static void main(String args[]){
	    MediaPlayer player = new MP3Player();
	    player.play("testmp3file.mp3");
	    player = new MediaPlayerAdapter(new MP4Player());
	    player.play("testmp4file.mp4");
	    player = new MediaPlayerAdapter(new VLCPlayer());
	    player.play("testvlcfile.avi");
	}
}

Output

Playing MP3 file testmp3file.mp3
Using MediaPlayerAdapter - Playing MP4 file testmp4file.mp4
Using MediaPlayerAdapter - Playing VLC file testvlcfile.avi