适配器模式作为两个不兼容接口之间的桥梁,一般不用系统详细设计时,大多数用来解决正在服役的项目问题,比如需要再现有系统的接口之外加入另一个接口,满足用户的新需求,此时就可以用适配器模式。
1.接口
package adapter.interfaces;
public interface MediaPlayer {
void play(String audioType, String fileName);
}
package adapter.interfaces;
public interface AdvanceMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
2.实现类
package adapter.classes;
import adapter.adapter.MediaAdapter;
import adapter.interfaces.MediaPlayer;
public class AudioPlayer implements MediaPlayer{
private MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Mp3Player:" + fileName);
}else if(audioType.equalsIgnoreCase("mp4") || audioType.equalsIgnoreCase("vlc")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
}else{
System.out.println("不支持" + audioType + "这种格式的文件!");
}
}
}
package adapter.classes;
import adapter.interfaces.AdvanceMediaPlayer;
public class Mp4Player implements AdvanceMediaPlayer{
@Override
public void playVlc(String fileName) {
}
@Override
public void playMp4(String fileName) {
System.out.println("Mp4Player:" + fileName);
}
}
package adapter.classes;
import adapter.interfaces.AdvanceMediaPlayer;
public class VlcPlayer implements AdvanceMediaPlayer{
@Override
public void playVlc(String fileName) {
System.out.println("VlcPlayer:" + fileName);
}
@Override
public void playMp4(String fileName) {
}
}
3.适配器
package adapter.adapter;
import adapter.classes.Mp4Player;
import adapter.classes.VlcPlayer;
import adapter.interfaces.AdvanceMediaPlayer;
import adapter.interfaces.MediaPlayer;
public class MediaAdapter implements MediaPlayer{
private AdvanceMediaPlayer advanceMediaPlayer;
public MediaAdapter(String audioType) {
if(audioType.equalsIgnoreCase("vlc")){
advanceMediaPlayer = new VlcPlayer();
}else if(audioType.equalsIgnoreCase("mp4")){
advanceMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("vlc")){
advanceMediaPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase("mp4")){
advanceMediaPlayer.playMp4(fileName);
}
}
}
4.测试类
package adapter.demo;
import adapter.classes.AudioPlayer;
public class Demo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "dream it possible");
audioPlayer.play("mp4", "the rythm of rain");
audioPlayer.play("vlc", "the heart will go on");
audioPlayer.play("avi", "rock");
}
}
5.测试结果
Mp3Player:dream it possible
Mp4Player:the rythm of rain
VlcPlayer:the heart will go on
不支持avi这种格式的文件!
再原有的实现类AudioPlayer里面调用适配器,将新加入的实现类Mp4Player和VlcPlayer连接起来,从而实现新的需求。