适配器模式
1. 介绍
适配器模式(Adapter Pattern)
是一种结构型模式。适配器模式是用来合并两个接口的功能。
可以这样理解:有一个非常大的商城实现了商城接口,这个商城没有提款和存钱的功能,而提款和存钱的功能银行接口提供了,那这个商城只需要实现银行接口不就可以实现提款和存钱的功能了吗?但是,如果银行接口中还有许多其他的方法,例如:借款、金融服务等,而这些功能是商城不需要的,这就很麻烦。可以在商城中增加一个银行柜台(实现了商城接口并内嵌了一个银行对象),当客户需要提款和存钱的时候,就调用银行柜台的相应方法,这样就解决了商城和银行两个接口之间的矛盾了。
优点
- 让两个没有关联的接口可以相互配合。
缺点
- 过多的使用适配器模式可能会导致接口的模糊性。因为适配器模式将接口后的实现过程进行了替换,就会增加接口的模糊度。
2. 例子
现在有一个AudioPlayer(音频播放器),它实现了MediaPlayer(媒体播放器)接口,现在要让它能够实现AdvancedMediaPlayer接口的功能,这个时候,就需要构造一个实现了MediaPlayer接口且其中内嵌了一个实现了AdvancedMediaPlayer接口的适配器对象,然后将这个适配器对象加入到AudioPlayer类中,AudioPlayer对象就拥有了AdvancedMediaPlayer这个接口的功能。
类图如下:
MedioPlayer(媒体播放器)接口:
package adapterPattern;
public interface MediaPlayer {
public void play(String fileType);
}
AdvancedMediaPlayer(先进的媒体播放器)接口:
package adapterPattern;
public interface AdvancedMediaPlayer {
public void playVlc();
public void playMp4();
}
Vlc播放器类:
实现了AdvancedMediaPlayer接口
package adapterPattern;
public class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc() {
System.out.println("播放Vlc文件");
}
@Override
public void playMp4() {
System.out.println("播放Mp4文件");
}
}
Mp4播放器类:
实现了AdvancedMediaPlayer接口
package adapterPattern;
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc() {
System.out.println("播放Vlc文件");
}
@Override
public void playMp4() {
System.out.println("播放Mp4文件");
}
}
MediaAdapter类:
媒体播放器适配器类,它实现了MediaPlayer类,且内嵌了一个AdvancedMediaPlayer对象
package adapterPattern;
public class MediaAdapter implements MediaPlayer {
private AdvancedMediaPlayer advancedMediaPlayer = new Mp4Player();
@Override
public void play(String fileType) {
if (fileType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMp4();
} else if (fileType.equalsIgnoreCase("vls")) {
advancedMediaPlayer.playVlc();
}
}
}
AudioPlayer类:
实现了MediaPlayer接口,内部有一个mediaAdapter(媒体适配器)类,就是这个适配器类让它具有了AdvancedMediaPlayer接口的功能。
package adapterPattern;
public class AudioPlayer implements MediaPlayer {
private MediaAdapter mediaAdapter = new MediaAdapter();
@Override
public void play(String fileType) {
if (fileType.equalsIgnoreCase("mp4") || fileType.equalsIgnoreCase("vls")) {
mediaAdapter.play(fileType);
} else {
System.out.println("AudioPlayer正在打开文件");
}
}
}
测试类:
package adapterPattern;
import org.junit.Test;
public class TestJ {
@Test
public void test1() {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp4");
audioPlayer.play("vls");
audioPlayer.play("text");
}
}
运行结果:
播放Mp4文件
播放Vlc文件
AudioPlayer正在打开文件
从运行结果可以看出,实现了MediaPlayer接口的AudioPlayer类由于使用了MediaAdapter(适配器),从而也具备了AdvancedMediaPlayer接口中的功能,也就是适配器让实现了一个接口的类结合了另一个接口的功能。
3. 总结
适配器模式就是在实现了接口i1的类A中添加一个适配器对象来达到让这个类具有另一个接口i2中的功能,而关键就在于这个适配器对象的构建,这个适配器类不仅要继承i1接口,同时也要包含i2接口的实现类的实例。