适配器模式(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 {@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: "+ fileName);}}
创建实现了 MediaPlayer 接口的适配器类
public class MediaAdapter implements MediaPlayer {private AdvanceMediaPlayer advancedMediaPlayer;@Overridepublic 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;@Overridepublic 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源码设计模式》
技术文章:菜鸟教程-设计模式
