什么是适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换为客户期望的另一个接口。通过适配器,原本不兼容的接口可以一起工作,从而提高系统的灵活性和可扩展性。
关键元素:
- 目标接口:客户端希望使用的接口。
- 适配器类:一个中间类,实现目标接口,并将对目标接口的方法调用转发给需要适配的类。
- 被适配者类:需要被适配的类,它有一个不兼容的接口。
优势:
- 兼容性:将不兼容的接口转换为兼容的接口。
- 解耦:客户端不需要关心被适配者类的具体接口,适配器负责处理这些细节。
- 灵活性:可以在不改变原始类的情况下,添加新功能。
缺点
- 过多地使用适配器,容易使代码结构混乱,如明明看到调用的是A 接口,内部调用的却是B 接口的实现。
举个例子:
我们有一个名为 MediaPlayer
的目标接口,表示一个媒体播放器;还有一个被适配的类 AdvancedMediaPlayer
,表示一个高级媒体播放器。通过 MediaPlayerAdapter
类,将 AdvancedMediaPlayer
适配为 MediaPlayer
接口。
// 目标接口:MediaPlayer
interface MediaPlayer {void play(String audioType, String fileName);
}// 被适配者类:AdvancedMediaPlayer
class AdvancedMediaPlayer {void playVlc(String fileName) {System.out.println("Playing VLC file: " + fileName);}void playMp4(String fileName) {System.out.println("Playing MP4 file: " + fileName);}
}// 适配器类:MediaPlayerAdapter,将 AdvancedMediaPlayer 适配为 MediaPlayer
class MediaPlayerAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMediaPlayer;// 构造函数中创建被适配者类的实例public MediaPlayerAdapter() {this.advancedMediaPlayer = new AdvancedMediaPlayer();}@Overridepublic void play(String audioType, String fileName) {// 根据音频类型选择合适的方法if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer.playMp4(fileName);} else {System.out.println("Unsupported audio type: " + audioType);}}
}// 客户端代码
public class AdapterPatternExample {public static void main(String[] args) {// 创建 MediaPlayerAdapter 对象MediaPlayer mediaPlayer = new MediaPlayerAdapter();// 使用 MediaPlayer 接口播放不同类型的音频文件mediaPlayer.play("vlc", "song1.vlc");mediaPlayer.play("mp4", "song2.mp4");mediaPlayer.play("mp3", "song3.mp3"); // 不支持的音频类型}
}
,MediaPlayerAdapter
类实现了 MediaPlayer
接口,并在其中使用 AdvancedMediaPlayer
类的实例。通过适配器,客户端可以使用 MediaPlayer
接口播放不同类型的音频文件,而不需要直接与 AdvancedMediaPlayer
类交互。