适配器模式
定义:将一个类的接口转为客户需要的另一个接口。目的是使原本不兼容而不能一起工作的那些类可以一起工作。
适配器模式从实现方式上分为两种,类适配器和对象适配器。这两种的区别在与实现方式的不同,一种采用继承,一种采用组合。
另外从使用目的也为分了两种,特殊适配器和缺省适配器。一种是为了复用原有的代码并适配当前的接口,一种是为了提供缺省的实现,避免子类实现不该实现的方法。
1、类适配器
如:我想给hashMap实现一个接口,但是我没法给他加啊。于是我可以新写一个类来继承HashMap,然后实现接口。
2、对象适配器
如果这个类已经有了继承关系,就需要将类用组合的方式适配
使用场景:想修改一个现有在运行的系统的接口来适应新的接口需求的时候。
注意事项:适配器模式不是在系统设计时使用的,而是为了解决正在运行的系统问题。
示例场景:目前系统里有一个VideoPlayer接口以及两个实现类Mp4Player和AviPlayer正在工作。而第三方要求我们提供一个MediaPlayer格式的接口,而我们又不能去改VideoPlayer接口的代码。那么怎么办呢?我们加了一个MediaAdapter来做中间的适配,然后写了一个实现类(MediaPlayerImpl)来实现MediaPlayer接口,这个类通过使用MediaAdapter来适配之前系统的接口。
代码示例:
public interface VideoPlayer {
void playVideo();
}
public class Mp4Player implements VideoPlayer {
@Override
public void playVideo() {
System.out.println("播放mp4视频");
}
}
public class AviPlayer implements VideoPlayer {
@Override
public void playVideo() {
System.out.println("播放avi视频");
}
}
public interface MediaPlayer {
void play(String mediaType);
}
public class MediaAdapter implements MediaPlayer {
private VideoPlayer videoPlayer;
public MediaAdapter(String videoType) {
if(videoType.equalsIgnoreCase("mp4")){
videoPlayer=new Mp4Player();
}else if(videoType.equalsIgnoreCase("avi")){
videoPlayer=new AviPlayer();
}
}
@Override
public void play(String mediaType) {
videoPlayer.playVideo();
}
}
public class MediaPlayerImpl implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String mediaType) {
mediaAdapter=new MediaAdapter(mediaType);
mediaAdapter.play(mediaType);
}
}
测试代码:
public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
MediaPlayer mediaPlayer=new MediaPlayerImpl();
mediaPlayer.play("avi");
}