浅谈Java设计模式之适配器模式

生活中常常会到这种问题,例如中国的标准电压是220v,美国则是110v。若是想要在美国使用中国的电器,咱们须要有一个电压适配器做为中间桥梁进行电压的转换。
java

适配器模式就是这样的功能,是两个不兼容的接口的桥梁,属于一种结构型模式,结合了两个接口的功能。ide

如今有一个媒体播放器,有两个子类,一个播放器能够播放mp4格式文件,一个能够播放vlc格式文件:测试

/**
 * 播放器接口
 * @author 樱桃肉丸子
 */
public interface AdvancedMediaPlayer {

    void playVlc(String fileName);
    void playMp4(String fileName);

}
/**
 * MP4播放器
 * @author 樱桃肉丸子
 */
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        //do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("mp4播放");
    }
}
/**
 * VLC播放器
 * @author 樱桃肉丸子
 */
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("VLC播放");
    }

    @Override
    public void playMp4(String fileName) {
        //do nothing
    }
}

至此,咱们如今能够播放mp4和vlc格式的文件了,可是此时有一个更高的要求,就是但愿有一个播放器能够同时播放mp4和vlc格式的文件,此时建立一个接口来表示更高级的播放器:接口

/**
 * 更高级的播放器接口
 * @author 樱桃肉丸子
 */
public interface MediaPlayer {
    void play(String audioType, String fileName);
}

此时,咱们须要建立一个适配器。这个适配器能够根据咱们的需求自动转换为响应的播放器 。
it

/**
 * 适配器实现类
 * @author 樱桃肉丸子
 */
public class MediaAdapter implements MediaPlayer{

    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType){
        if(audioType.equalsIgnoreCase("vlc") ){
            advancedMediaPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            advancedMediaPlayer.playVlc(fileName);
        }else if(audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}

此时建立高级播放器的子类来实现播放的功能。该类经过适配器达到灵活播放的效果。io

/**
 * 自动播放器
 * @author 樱桃肉丸子
 */
public class AudioPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;


    @Override
    public void play(String audioType, String fileName) {

        //内置mp3播放器
        if("mp3".equalsIgnoreCase(audioType)){
            System.out.println("播放mp3文件");
        //mp4或vlc格式文件
        }else if("mp4".equalsIgnoreCase(audioType) || "vlc".equalsIgnoreCase(audioType)){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }else{
            System.out.println("系统暂不支持该类型文件的播放!!!");
        }


    }
}

最后看一下效果:
class

/**
 * 测试类
 * @author 樱桃肉丸子
 */
public class AdapterPatternDemo {

    public static void main(String[] args) {
        //播放mp4文件
        MediaPlayer mediaPlayer = new AudioPlayer();
        mediaPlayer.play("mp4","a.mp3");
        //播放vlc文件
        mediaPlayer.play("vlc","b.vlc");


    }
}


总结:dva

在这个例子中,mp4和vlc两个接口本不兼容,可是经过适配器中的灵活调用,使新的播放器同时具备了两种功能。从功能层面上能够在AutoPlayer直接将适配器的代码写入,但鄙人认为将这种兼容性的代码单独封装会好一点呢。兼容性

相关文章
相关标签/搜索