适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式是一个“补救”模式,通常用来解决接口之间不兼容的问题。

场景

  • 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
  • 需要一个统一的输出接口,但是输入端的类型不可预知

实现

最开始媒体设备只能播放MP3,后来在原来能力的基础上添加MP4的能力支持

为媒体播放器和更高级的媒体播放器创建接口

MediaPlayer

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

AdvanceMediaPlayer

  1. public interface AdvanceMediaPlayer {
  2. void playMp4(String fileName);
  3. }

创建实现了 AdvancedMediaPlayer 接口的实体类

AdvancePlayer

  1. public class AdvancePlayer implements AdvanceMediaPlayer {
  2. @Override
  3. public void playMp4(String fileName) {
  4. System.out.println("Playing mp4 file. Name: "+ fileName);
  5. }
  6. }

创建实现了 MediaPlayer 接口的适配器类
  1. public class MediaAdapter implements MediaPlayer {
  2. private AdvanceMediaPlayer advancedMediaPlayer;
  3. @Override
  4. public void play(String audioType, String fileName) {
  5. if (audioType.equalsIgnoreCase("mp4")) {
  6. advancedMediaPlayer = new AdvancePlayer();
  7. advancedMediaPlayer.playMp4(fileName);
  8. }
  9. }
  10. }

创建播放器实例Player
  1. public class Player implements MediaPlayer {
  2. private MediaAdapter mediaAdapter;
  3. @Override
  4. public void play(String audioType, String fileName) {
  5. // 播放Mp3支持,属于老代码逻辑
  6. if (audioType.equalsIgnoreCase("mp3")) {
  7. System.out.println("Playing mp3 file. Name: " + fileName);
  8. } else if (audioType.equalsIgnoreCase("mp4")) {
  9. // 属于新功能,通过适配器支持
  10. mediaAdapter = new MediaAdapter();
  11. mediaAdapter.play(audioType, fileName);
  12. }
  13. }
  14. }

优点

  • 可以让任何两个没有关联的类一起运行
  • 提高了类的复用
  • 增加了类的透明度
  • 灵活性好

缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现

Android 中的应用

ListView、BaseAdapter

参考

书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式