适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式是一个“补救”模式,通常用来解决接口之间不兼容的问题。
场景
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
- 需要一个统一的输出接口,但是输入端的类型不可预知
实现
最开始媒体设备只能播放MP3,后来在原来能力的基础上添加MP4的能力支持
为媒体播放器和更高级的媒体播放器创建接口
MediaPlayer
public interface MediaPlayer {
void play(String audioType, String fileName);
}
AdvanceMediaPlayer
public interface AdvanceMediaPlayer {
void playMp4(String fileName);
}
创建实现了 AdvancedMediaPlayer 接口的实体类
AdvancePlayer
public class AdvancePlayer implements AdvanceMediaPlayer {
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file. Name: "+ fileName);
}
}
创建实现了 MediaPlayer 接口的适配器类
public class MediaAdapter implements MediaPlayer {
private AdvanceMediaPlayer advancedMediaPlayer;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer = new AdvancePlayer();
advancedMediaPlayer.playMp4(fileName);
}
}
}
创建播放器实例Player
public class Player implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
// 播放Mp3支持,属于老代码逻辑
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing mp3 file. Name: " + fileName);
} else if (audioType.equalsIgnoreCase("mp4")) {
// 属于新功能,通过适配器支持
mediaAdapter = new MediaAdapter();
mediaAdapter.play(audioType, fileName);
}
}
}
优点
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用
- 增加了类的透明度
- 灵活性好
缺点
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现
Android 中的应用
ListView、BaseAdapter
参考
书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式