「软件工程-设计模式」 适配器模式

Posted by Dawn-K's Blog on February 22, 2021

适配器模式

概述

适配器模式主要是用来链接两个接口, 比如我们希望通过增加一个第三方的类来增强我们现有的类的功能, 但是我们不想继承这个类(java只能单继承, 或者出于其他因素), 就往往使用适配器模式. 将新的类作为现有的类的一个成员, 原类通过调用这个成员的方法来增强自身功能.

实现

比如我们最开始有个 MediaPlayer 接口, 然后我们实现了一个 AudioPlayer类, 可以播放 mp3格式的文件.

1
2
3
public interface MediaPlayer {
   public void play(String audioType, String fileName);
}

然后我们新引入了一个能播放 mp4和 vlc 的接口. 并且也有对应的实现.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public interface AdvancedMediaPlayer { 
   public void playVlc(String fileName);
   public void playMp4(String fileName);
}
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) {
      //什么也不做
   }
}
public class Mp4Player implements AdvancedMediaPlayer{
 
   @Override
   public void playVlc(String fileName) {
      //什么也不做
   }
 
   @Override
   public void playMp4(String fileName) {
      System.out.println("Playing mp4 file. Name: "+ fileName);      
   }
}

现在我们想让 AudioPlayer类增加播放 Mp4 和 vlc 格式的能力, 将最简化这个操作. 我们就新增适配器类.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
      }
   }
}

这个适配器就可以承担起播放 vlc和 Mp4的任务. 然后我们将这个适配器装入 AudioPlayer类.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class AudioPlayer implements MediaPlayer {
   MediaAdapter mediaAdapter; 
 
   @Override
   public void play(String audioType, String fileName) {    
 
      //播放 mp3 音乐文件的内置支持
      if(audioType.equalsIgnoreCase("mp3")){
         System.out.println("Playing mp3 file. Name: "+ fileName);         
      } 
      //mediaAdapter 提供了播放其他文件格式的支持
      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");
      }
   }   
}

// AudioPlayer audioPlayer = new AudioPlayer();
// audioPlayer.play("mp3", "beyond the horizon.mp3");
// audioPlayer.play("mp4", "alone.mp4");
// audioPlayer.play("vlc", "far far away.vlc");