概念
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作使用。
以音乐播放器为例子
首先,我们创建一个音乐播放器的接口。
public interface MusicPlayer {
/**
* 播放音乐
*
* @param type
* 音乐格式
* @param filename
* 文件
*/
public void play(String type, String filename);
}
然后,引入一个音频解码的库。
public class ExistPlayer {
public void playMp3(String filename){
System.out.println("play mp3 : "+filename);
}
public void playWma(String filename){
System.out.println("play wma : "+filename);
}
}
假设这个不改动这个音频库的源代码,怎么让系统对这个库进行兼容支持呢?那么我们就需要创建一个适配器进行兼容。
public class PlayerAdapter implements MusicPlayer {
// 在适配器中使用旧接口
private ExistPlayer player;
public PlayerAdapter() {
player = new ExistPlayer();
}
@Override
public void play(String type, String filename) {
if (type == "mp3") {
player.playMp3(filename);
} else if (type == "wma") {
player.playWma(filename);
}
}
}
最后,我们调用播放器,就会根据传入的音频类型,进行自动的适配解码处理。
public static void main(String[] args) {
MusicPlayer player = new PlayerAdapter();
player.play("mp3", "music");
player.play("wma", "wahaha");
}
作用
作为一个中间者协调不兼容的双方,用于解决新旧系统( 或新旧接口 )之间的兼容问题,使其兼容。
优点和缺点
优点:
- 可以让两个不相干的类一起运行,无需修改旧代码,灵活性好。
缺点:
- 适配器模式用多了会使整个系统变得很复杂,因为你调用的是适配器,却不知道适配器内部做了多少转换操作,所以在能用别的办法解决问题时,尽量少用适配器模式。