适配器模式

适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

生活例子:充电头和插座不兼容,而解决方法是买一个转换头,这是典型的适配器模式,转换头就是我们所说的适配器

适配器主要分为两种:类适配器(继承),对象适配器(实现接口,使用较多)

使用场景:适配器适合用于解决新旧系统( 或新旧接口 )之间的兼容问题,而不建议在一开始就直接使用。

使用

举例最近接了个音乐播放器的项目,要求支持 mp3、wma 等格式,于是定义了新接口:

/**
 * 模拟自己定义的新接口
 * @author aodeng-低调小熊猫
 * @since 19-7-17
 */
public interface MusicPlayer {

    /** 
    * <p>
    * 音乐播放器
    * </p> 
    * @author aodeng
    * @since 19-7-17
    */
    public void play(String type,String fileName);
}

但是想那么多种格式要支持,自己去一一实现太麻烦了,干脆直接找现成的库来用用。

/**
 * 模拟已经旧的接口 模拟该库是个 jar 包,不能改它源码 的情况下,适配器模式 实现我们的接口
 * @author aodeng-低调小熊猫
 * @since 19-7-17
 */
public class ExistPlayer {

    /**
    * <p>
    * 播放mp3文件
    * </p>
    * @author aodeng
    * @since 19-7-17
    */
    public void playMp3(String fileName){
        System.out.println("play mp3"+fileName);
    }

    /**
    * <p>
    * 播放mp4文件
    * </p>
    * @author aodeng
    * @since 19-7-17
    */
    public void playMp4(String fileName){
        System.out.println("play mp4"+fileName);
    }
}

然后发现这个库的接口跟自己定义的不一样,而且该库是个 jar 包,不能改它源码,就算能改也不能这么做,因为其他地方可能有调用此处代码,改了有可能会导致系统崩溃。

咋办?写个适配器呗。

/**
 * 写个适配器 适配器实现我们的新接口,在适配器中使用我们的旧接口
 * @author aodeng-低调小熊猫
 * @since 19-7-17
 */
public class PlayerAdapter implements MusicPlayer{

    //使用旧接口
    private ExistPlayer existPlayer;

    public PlayerAdapter(){
        existPlayer=new ExistPlayer();
    }

    @Override
    public void play(String type, String fileName) {
        if ("mp3".equals(type)){
            existPlayer.playMp3(fileName);
        }else if ("mp4".equals(type)){
            existPlayer.playMp4(fileName);
        }

    }
}

测试结果

    public static void main(String[] args) {
        System.out.println("Hello World!");
        //客户端调用
        MusicPlayer musicPlayer=new PlayerAdapter();
        musicPlayer.play("mp3","XXX.mp3 file");
        musicPlayer.play("mp4","XXX.mp4 file");
        //控制台输出
        /*
        Hello World!
        play mp3XXX.mp3 file
        play mp4XXX.mp4 file
        */
    }

慢慢领悟其精髓

源码

源码地址:https://github.com/java-aodeng/hope

人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科幻电影中的场景将成为现实,未来已来!详情: