Design-pattern-adapter-pattern
デザインパターン-アダプターパターン
アダプタパターンは、2つの互換性のないインターフェイス間のブリッジとして機能します。 このタイプの設計パターンは、2つの独立したインターフェースの機能を組み合わせた構造パターンの下にあります。
このパターンには、独立または互換性のないインターフェイスの機能を結合する単一のクラスが含まれます。 実際の例としては、メモリカードとラップトップ間のアダプタとして機能するカードリーダーの場合があります。 メモリカードをカードリーダーに差し込み、カードリーダーをラップトップに差し込み、ラップトップ経由でメモリカードを読み取れるようにします。
次の例では、オーディオプレーヤーデバイスはmp3ファイルのみを再生でき、vlcおよびmp4ファイルを再生できる高度なオーディオプレーヤーを使用するアダプターパターンの使用を示しています。
実装
_MediaPlayer_インターフェースと、_MediaPlayer_インターフェースを実装する具象クラス_AudioPlayer_があります。 _AudioPlayer_は、デフォルトでmp3形式のオーディオファイルを再生できます。
別のインターフェース_AdvancedMediaPlayer_と、_AdvancedMediaPlayer_インターフェースを実装する具象クラスがあります。 これらのクラスは、vlcおよびmp4形式のファイルを再生できます。
_AudioPlayer_を作成して、他の形式も再生できるようにします。 これを実現するために、_MediaPlayer_インターフェイスを実装し、_AdvancedMediaPlayer_オブジェクトを使用して必要な形式を再生するアダプタークラス_MediaAdapter_を作成しました。
_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
出力を確認します。
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