[Design Pattern] Adapter Pattern 简单案例

Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式。 或者叫做,转换器模式。

 

下面是一个转换器模式简单案例。

假设已有 AudioPlayer 专门播放 mp3 格式文件,VlcPlayer 和 Mp4Player 是高级播放器,分别播放 vlc 和  mp4 格式文件,客户端代码调用 AudioPlayer 来播放 mp3 格式的文件。

此时,不想修改 AudioPlayer 和 AdvanceMediaPlayer 的接口,也不希望修改客户端 AdapterPatternDemo 调用播放功能的方式,却能扩展地播放 vlc 和 mp4 格式的文件。

通过在 AudioPlayer 和 AdvanceMediaPlayer 直接增加一层适配器,能实现需要的效果。

 

代码实现:

AdvanceMediaPlayer 接口

public interface AdvanceMediaPlayer {
    
    public void playVlc(String fileName);
    
    public void playMp4(String fileName);
}

Mp4Player / VlcPlayer 类的实现,实现 AdvanceMediaPlayer 接口

public class Mp4Player implements AdvanceMediaPlayer {

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

    @Override
    public void playMp4(String fileName) {
        System.out.println("Mp4player - playMp4 playing :" + fileName);
    }
}

 

public class VlcPlayer implements AdvanceMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        System.out.println("VlcPlayer - playVlc playing :" + fileName);
    }

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

 

MediaPlayer 接口

public interface MediaPlayer {
    
    public void play(String format, String fileName);
}

MediaAdapter ,提供播放 vlc 和 mp4 格式的转换功能

public class MediaAdapter implements MediaPlayer {

    AdvanceMediaPlayer vlcPlayer;
    AdvanceMediaPlayer mp4Player;
    
    public MediaAdapter(){
        vlcPlayer = new VlcPlayer();
        mp4Player = new Mp4Player();
    }
    
    @Override
    public void play(String format, String fileName) {
        if ("vlc".equals(format)){
            vlcPlayer.playVlc(fileName);
        }
        else if ("mp4".equals(format)){
            mp4Player.playMp4(fileName);
        }
    }
}

AudioPlayer,内置播放 mp3 格式功能,同时内含一个适配器用于播放其他格式文件

public class AudioPlayer implements MediaPlayer {

    private MediaAdapter mediaAdapter = new MediaAdapter();
    
    @Override
    public void play(String format, String fileName) {
        
        if ("mp3".equals(format)){
            System.out.println("AudioPlayer - paly : mp3 ");
        }
        else if ("mp4".equals(format) || "vlc".equals(format)){
            mediaAdapter.play(format, fileName);
        }
        else{
            System.out.println("Invalid format file");
        }
    }
}

演示代码,客户端 AdapterPatternDemo ,使用同一个接口、方式,即可播放除了 mp3 之外的其他格式文件。

public class AdapterPatternDemo {
    
    public static void main(){
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3", "aaa.mp3");
        audioPlayer.play("mp4", "bbb.mp4");
        audioPlayer.play("vlc", "bbb.vlc");
        audioPlayer.play("qqq", "bbb.vlc");
    }
}

 

参考资料

Design Patterns - Adapter Pattern, TutorialsPoint 

 

posted @ 2016-05-21 14:17  TonyYPZhang  阅读(291)  评论(0编辑  收藏  举报