文章目录
1、适配器模式
- 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁
- 目的是将一个类的接口转换成客户希望的另外一个接口
- 适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
最后,适配器是对已经开发完的系统的一种改造思路,新设计尽量一次设计好,或者时间充裕就重构。适配器太多会使得系统很乱,看着在调A接口,底下已被适配到了B接口。
2、举例
背景:有两个接口,分别为媒体播放器(播放音频)、高级媒体播放器(播放视频)。创建适配器,将二者的功能融合。两个接口:
java
/**
* 高级媒体播放器
* 可播放视频
*/
public interface AdvanceMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
java
/**
* 媒体播放器接口
* 可播放音频
*/
public interface MediaPlayer {
public void play(String audioType, String fileName);
}
写高级媒体播放器的实现类:
java
public class Mp4Player implements AdvanceMediaPlayer{
@Override
public void playVlc(String fileName) {
当前格式为mp4格式,对vlc的播放不做具体实现
}
@Override
public void playMp4(String fileName) {
System.out.println("播放Mp4文件:" + fileName);
}
}
java
public class VlcPlayer implements AdvanceMediaPlayer{
@Override
public void playVlc(String fileName) {
System.out.println("播放vlc文件:" + fileName);
}
@Override
public void playMp4(String fileName) {
//当前格式为vlc格式,对mp4的播放不做具体实现
}
}
创建适配器,注入待合并的那个接口的对象。自定义有参构造方法,并对待合并接口对象完成初始化赋值:
java
public class MediaPlayerAdapter implements MediaPlayer {
private AdvanceMediaPlayer advanceMediaPlayer;
/**
* 定义个有参的构造方法,形参为自定义的String类型
* @param audioType 媒体文件类型
*/
public MediaPlayerAdapter(String audioType) {
if ("vlc".equalsIgnoreCase(audioType)) {
advanceMediaPlayer = new VlcPlayer();
} else if ("mp4".equalsIgnoreCase(audioType)) {
advanceMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
//判断当前媒体的格式是mp4还是vlc
if ("vlc".equalsIgnoreCase(audioType)) {
//播放vlc文件
advanceMediaPlayer.playVlc(fileName);
} else if ("mp4".equalsIgnoreCase(audioType)) {
//播放mp4文件
advanceMediaPlayer.playMp4(fileName);
}
}
}
到此,适配器拥有了待合并接口所有实现类的功能。写另一个接口媒体播放器的实现类,里面注入适配器对象,如果是音频,则实现类正常完成,如果是视频,则通过适配器完成:
java
public class AudioPlayer implements MediaPlayer {
private MediaPlayerAdapter adapter;
@Override
public void play(String audioType, String fileName) {
//音频文件,比如mp3
if ("mp3".equalsIgnoreCase(audioType)) {
System.out.println("播放mp3文件:" + fileName);
} else if ("vlc".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)) {
//视频文件(高级媒体文件)
adapter = new MediaPlayerAdapter(audioType);
adapter.play(audioType, fileName); //到此,完成了两个接口的适配,不管是音频还是视频,我这儿都能播放
}
}
}
到此,完成合并,测试类:
java
public class Test {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "啦啦啦.mp3");
audioPlayer.play("vlc", "喜羊羊.vlc");
audioPlayer.play("mp4", "视频.mp4");
}
}