设计模式系列——适配器模式

75 阅读2分钟

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

适配器模式就是将两个不兼容的接口进行兼容处理。生活中比较常见的例子就是电源适配器。笔记本电脑一般都是5-20伏的低电压,市电是220伏的电压,这个时候就需要电源适配器的帮忙,将220伏电压转换成符合要求的低电压。

日常开发中经常会用到这个设计模式,A接口的提供的参数和方法不符合B接口的使用要求,但是双方改起来都比较困难,这个时候就可以考虑使用适配器模式。

举个例子

拿媒体播放器举例,假设播放器有个play()方法,只支持播放MP3格式的文件,这个时候底层硬件厂商提供了新的功能接口,可以支持vlc和MP4格式的文件播放,但是方法名称变成了playVLC()和palyMP4(),为了让播放器能够使用统一的play()方法实现三种文件的播放,需要引入适配器类,来调和两个不兼容的接口。

先来看一下该例子的UML图:

adapter.png

来看一下具体代码实现

public interface MediaPlayer {
    void play(String audioType, String fileName);
}
//新的接口 实现Vlc和Mp4格式播放
public interface AdvancedMediaPlayer {
    
    void playVlc(String fileName);

    void playMp4(String fileName);
}

引入适配器,使AdvancedMediaPlayer接口格式符合MediaPlayer接口格式

public class MediaAdapter implements MediaPlayer {

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

    //注意这段代码逻辑
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")){
            advancedMusicPlayer.playVlc(fileName);
        }else if (audioType.equalsIgnoreCase("mp4")){
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

看一下播放器的具体代码实现

public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    //支持多种格式播放
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: " + fileName);
        }else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
         //播放vlc或mp4
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType,fileName);
        }else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

看一下客户端代码如何使用

public class AdapterPatternDemo {
    public static void main(String[] args){
        AudioPlayer audioPlayer = new AudioPlayer();

        //调用方式都是统一的,适配器做了底层兼容
        audioPlayer.play("mp3""beyond the horizon.mp3");
        audioPlayer.play("mp4""alone.mp4");
        audioPlayer.play("vlc""far far away.vlc");
        audioPlayer.play("avi""mind me.avi");
    }
}

总结

适配器模式是七种结构型模式之一,日常使用频率很高,经常用于调和两个不兼容的接口。

本文参考 www.tutorialspoint.com/design_patt…

推荐阅读

1. Java并发编程那些事儿(十)——最后的总结

2. 程序员应该掌握的常用网络问题定位工具

3. Awk这件上古神兵你会用了吗

4. 手把手教你搭建一套ELK日志搜索运维平台