Design-pattern-adapter-pattern

提供:Dev Guides
移動先:案内検索

デザインパターン-アダプターパターン

アダプタパターンは、2つの互換性のないインターフェイス間のブリッジとして機能します。 このタイプの設計パターンは、2つの独立したインターフェースの機能を組み合わせた構造パターンの下にあります。

このパターンには、独立または互換性のないインターフェイスの機能を結合する単一のクラスが含まれます。 実際の例としては、メモリカードとラップトップ間のアダプタとして機能するカードリーダーの場合があります。 メモリカードをカードリーダーに差し込み、カードリーダーをラップトップに差し込み、ラップトップ経由でメモリカードを読み取れるようにします。

次の例では、オーディオプレーヤーデバイスはmp3ファイルのみを再生でき、vlcおよびmp4ファイルを再生できる高度なオーディオプレーヤーを使用するアダプターパターンの使用を示しています。

実装

_MediaPlayer_インターフェースと、_MediaPlayer_インターフェースを実装する具象クラス_AudioPlayer_があります。 _AudioPlayer_は、デフォルトでmp3形式のオーディオファイルを再生できます。

別のインターフェース_AdvancedMediaPlayer_と、_AdvancedMediaPlayer_インターフェースを実装する具象クラスがあります。 これらのクラスは、vlcおよびmp4形式のファイルを再生できます。

_AudioPlayer_を作成して、他の形式も再生できるようにします。 これを実現するために、_MediaPlayer_インターフェイスを実装し、_AdvancedMediaPlayer_オブジェクトを使用して必要な形式を再生するアダプタークラス_MediaAdapter_を作成しました。

_AudioPlayer_は、アダプタークラス_MediaAdapter_を使用して、目的の形式を再生できる実際のクラスを認識せずに、目的のオーディオタイプを渡します。 デモクラス_AdapterPatternDemo_は、_AudioPlayer_クラスを使用してさまざまな形式を再生します。

アダプターパターンUML図

ステップ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