1. 什么是适配器模式?
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器让原本由于接口不兼容而不能一起工作的类可以一起工作。
简单来说,适配器就像是一个转接头,它连接两个不兼容的接口,使它们能够协同工作。
2. 为什么需要适配器模式?
在实际开发中,我们经常会遇到以下情况:
- 想使用一个已经存在的类,但其接口与我们的要求不符合
- 想创建一个可复用的类,但该类与一些不兼容的类一起工作
- 想使用一些已经存在的子类,但不可能对每一个子类都进行子类化以匹配新的接口
这时,适配器模式就能派上用场了。
3. 适配器模式的结构
适配器模式主要包含以下角色:
- 目标接口(Target):客户端所期望的接口
- 适配者(Adaptee):需要适配的类或接口
- 适配器(Adapter):连接目标接口和适配者的桥梁
4. 适配器模式的实现
假设有一个播放MP3音乐的应用,现在想要增加播放VLC格式音乐的功能。
首先,我们有一个现有的MP3播放器接口:
public interface MediaPlayer {
void play(String audioType, String fileName);
}
然后,有一个VLC播放器,但它的接口与MediaPlayer不兼容:
public class VlcPlayer {
public void playVlc(String fileName) {
System.out.println("Playing vlc file. Name: " + fileName);
}
}
现在,创建一个适配器来使VlcPlayer与MediaPlayer接口兼容:
public class MediaAdapter implements MediaPlayer {
VlcPlayer vlcPlayer;
public MediaAdapter() {
vlcPlayer = new VlcPlayer();
}
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("vlc")){
vlcPlayer.playVlc(fileName);
}
}
}
最后,可以在主程序中使用适配器:
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: " + fileName);
}
else if(audioType.equalsIgnoreCase("vlc")){
mediaAdapter = new MediaAdapter();
mediaAdapter.play(audioType, fileName);
}
}
}
5. 适配器模式的优缺点
优点:
- 提高了类的复用性
- 增加了类的透明度
- 灵活性和扩展性都非常好
缺点:
- 过多地使用适配器会让系统变得凌乱
- 由于JAVA至多继承一个类,所以至多只能适配一个适配者类
6. 适配器模式的应用场景
- 系统需要使用现有的类,而这些类的接口不符合系统的需要
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作
- 需要统一多个类的接口设计时
- 旧系统开发的类与新系统不一致时,可以使用适配器模式使得旧系统的功能同样能在新系统中使用