一、适配器模式
简介:
作为两个不兼容的接口之间的桥梁。
解决正在运行使用的项目的问题。
eg:安卓的耳机搭上接口转换器便可在苹果手机上使用。
何时使用:
1、系统想使用一个现有的类,但类的接口不符合系统要求。
2、通过接口转换,将一个类插入另一个类系中(适配器继承或依赖已有的对象,实现想要的目标接口)。
优点:
1、可一起运行两个无关联的类;
2、类复用性提高(通过继承或依赖);
3、类的透明性增加;
4、灵活性。
缺点:
1、过多使用使得系统整体凌乱
2、Java最多继承一个类,故最多只能适配一个适配器类,且目标必须为抽象类。
实现:
- 创建接口
package interfaceofthis;
public interface MediaPlayer {
public void play(String audioType,String filename);
}
package interfaceofthis;
public interface AdvancedMediaPlayer {
public void playVlc(String fileName);
public void playMpe(String fileName);
}
- 创建一个接口的实体类
package interfaceentity;
import interfaceofthis.AdvancedMediaPlayer;
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
// TODO 自动生成的方法存根
}
@Override
public void playMpe(String fileName) {
// TODO 自动生成的方法存根
System.out.println("这是MP4文件"+fileName);
}
}
package interfaceentity;
import interfaceofthis.AdvancedMediaPlayer;
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
// TODO 自动生成的方法存根
System.out.println("这是Vlc文件"+fileName);
}
@Override
public void playMpe(String fileName) {
// TODO 自动生成的方法存根
}
}
- 创建另一个接口的适配器类
package adapterclass;
import interfaceentity.Mp4Player;
import interfaceentity.VlcPlayer;
import interfaceofthis.AdvancedMediaPlayer;
import interfaceofthis.MediaPlayer;
public class MediaAdapter implements MediaPlayer{
AdvancedMediaPlayer advancedMediaPlayer;
public void play(String audioType, String filename) {
// TODO 自动生成的方法存根
if(audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer.playVlc(filename);
}
if(audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMpe(filename);
}
}
public MediaAdapter(String audioType) {
if(audioType.equals("vlc")) {
advancedMediaPlayer =new VlcPlayer();
}
else if(audioType.equals("mp4")) {
advancedMediaPlayer=new Mp4Player();
}
}
}
- 创建接口的实体类
package interfaceentity;
import adapterclass.MediaAdapter;
import interfaceofthis.MediaPlayer;
public class AudioPlayer implements MediaPlayer{
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String filename) {
// TODO 自动生成的方法存根
if(audioType.equalsIgnoreCase("mp3") ) {
System.out.println("这是MP3文件"+filename);
}
else if(audioType.equalsIgnoreCase("vlc")||audioType.equalsIgnoreCase("mp4")) {
mediaAdapter=new MediaAdapter(audioType);
mediaAdapter.play(audioType, filename);
}
else {
<