一、什么是适配器模式

image.png
看到这张图,很自然就能想象结构型模式的适配器模式。
适配器模式(Adapter Pattern)是作为两个不兼容(不存在继承关系)的接口之间的桥梁。

二、适配器模式简介与实例讲解

在实践中,旧版本存在一个MediaPlayer接口,在新版本中存在设计更完备的增强接口AdvancedMediaPlayer接口,AdvancedMediaPlayer的实现类实现了更多的功能,但为了兼容需求,还要对部分用户提供MediaPlayer接口,我们通过适配器,将AdvancedMediaPlayer转换为MediaPlayer接口。

适配器模式包含一下三个角色:

  1. Target(目标类):如MediaPlayer,目标类是一个接口,它是“被适配类”希望变成的样子。
  2. Adaptee(被适配类):如AdvancedMediaPlayer。它们拥有已经存在的接口,通常与目标不一致。
  3. Adapter(适配器类):作为一个转换器或包装器,是目标类的实现类,如MediaPlayerAdapter。

下图为这几个角色之间的UML关系图。
适配器模式.png

下面是MediaPlayer的的接口定义,以及实现类Mp3Player。

  1. //旧版本的MediaPlayer接口
  2. public interface MediaPlayer {
  3. public void play(String audioType, String fileName);
  4. }
  5. //实现了MediaPlayer接口,播放mp3格式
  6. public class Mp3Player implements MediaPlayer {
  7. @Override
  8. public void play(String audioType, String fileName) {
  9. if ("Mp3".equalsIgnoreCase(audioType))
  10. System.out.println("Playing Mp3 file. Name: " + fileName);
  11. else
  12. System.out.println("Invalid media. " + audioType + " format not supported");
  13. }
  14. }

下面是AdvancedMediaPlayer的接口定义,以及实现类VlcPlayer和Mp4Player。

  1. //AdvancedMediaPlayer增强接口
  2. public interface AdvancedMediaPlayer {
  3. public void playMax(String audioType, String fileName);
  4. }
  5. //实现了AdvancedMediaPlayer接口,播放vlc格式
  6. public class VlcPlayer implements AdvancedMediaPlayer {
  7. @Override
  8. public void playMax(String audioType, String fileName) {
  9. if ("Vlc".equalsIgnoreCase(audioType))
  10. System.out.println("Playing Vlc file. Name: " + fileName);
  11. else
  12. System.out.println("Invalid media. " + audioType + " format not supported");
  13. }
  14. }
  15. //实现了AdvancedMediaPlayer接口,播放mp4格式
  16. public class Mp4Player implements AdvancedMediaPlayer {
  17. @Override
  18. public void playMax(String audioType, String fileName) {
  19. if ("Mp4".equalsIgnoreCase(audioType))
  20. System.out.println("Playing Mp4 file. Name: " + fileName);
  21. else
  22. System.out.println("Invalid media. " + audioType + " format not supported");
  23. }
  24. }

下面是MediaPlayer的适配器MediaPlayerAdapter,实现了MediaPlayer接口,将AdvancedMediaPlayer作为成员变量,调用AdvancedMediaPlayer方法重写MediaPlayer接口play方法。

  1. //适配类
  2. public class MediaPlayerAdapter implements MediaPlayer {
  3. AdvancedMediaPlayer advancedMusicPlayer;
  4. public MediaAdapter(String audioType) {
  5. if (audioType.equalsIgnoreCase("Vlc")) {
  6. advancedMusicPlayer = new VlcPlayer();
  7. } else if (audioType.equalsIgnoreCase("Mp4")) {
  8. advancedMusicPlayer = new Mp4Player();
  9. }
  10. }
  11. @Override
  12. public void play(String audioType, String fileName) {
  13. if (audioType.equalsIgnoreCase("vlc")) {
  14. advancedMusicPlayer.playMax(fileName);
  15. } else if (audioType.equalsIgnoreCase("Mp4")) {
  16. advancedMusicPlayer.playMax(fileName);
  17. }
  18. }
  19. }

之后我们便可以使用需要的创建型设计模式来创建对象。