适配器模式
1. 模式定义
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的类可以一起工作。
2. 模式结构
适配器模式包含以下几个部分:
- 目标接口(Target):客户端所期望的接口,也是适配器要实现的接口。
- 适配器(Adapter):将源接口转换成目标接口的类,同时实现目标接口,将客户端请求委托给源接口对象进行处理。
- 源接口(Adaptee):需要被适配的已经存在的接口,但是它与客户端需求的接口不匹配。
3. 代码示例
下面的代码示例演示了如何使用适配器模式将一个不匹配的接口转换为客户端所期望的接口。
3.1 目标接口
public interface MediaPlayer {
public void play(String audioType, String fileName);
}
3.2 源接口
public interface AdvancedMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
3.3 适配器
public class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMusicPlayer;
public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase("vlc") ){
advancedMusicPlayer = new VlcPlayer();
}else if (audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("vlc")){
advancedMusicPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer.playMp4(fileName);
}
}
}
3.4 客户端
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
//播放 mp3 音乐文件的内置支持
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: " + fileName);
}
//mediaAdapter 提供了播放其他文件格式的支持
else if(audioType.equalsIgnoreCase("vlc")
|| audioType.equalsIgnoreCase("mp4")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
}
else{
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
}
3.5 测试
public class AdapterPatternTest {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");
}
}
输出结果如下:
Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported
4. 优缺点
4.1 优点
- 提高了类的复用性和灵活性,在不改变原有代码的基础上可以让同一个类在不同场景中扮演不同的角色。
- 提高了代码的可读性,适配器可以把实现不同接口的类封装成同一个类,使得代码更易于理解。
- 解决了两个不兼容接口之间的协作问题。
4.2 缺点
- 在增加适配器的同时,增加了代码的复杂性。
- 适配器模式不适合在实现过程中使用,而是用于后期扩展的接口转换,如果在设计之初就采用适配器模式,那么会增加额外的系统复杂度。
5. 适用场景
- 当需要使用的类的接口不符合要求时,可以使用适配器模式。
6. 总结
适配器模式是一种非常常用的设计模式,在实际开发中经常用到。它主要用于解决两个不兼容接口之间的协作问题,提高代码的复用性和可读性。