淺談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直接將適配器的代碼寫入,但鄙人認爲將這種兼容性的代碼單獨封裝會好一點呢。兼容性

相關文章
相關標籤/搜索