适配器(Adapter Pattern)可以将两个不兼容的接口的功能连起来。适配器就是两个不兼容的接口之间的桥梁。也属于结构型模式。
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
现在我们有两个播放器接口的实现类,一个是MP3播放器,一个是MP4播放器:
packagecom.xing.design.adapter; /*** 媒体播放器接口* @author xing* @createTime*/publicinterfaceMediaPlayer { /*** 播放* @param audioType 类型* @param fileName 文件名*/publicvoidplay(StringaudioType, StringfileName); } MP3:packagecom.xing.design.adapter; publicclassMp3PlayerimplementsMediaPlayer{ publicvoidplay(StringaudioType, StringfileName) { //播放 mp3 音乐文件的内置支持if(audioType.equalsIgnoreCase("mp3")){ System.out.println("播放 mp3 file. Name: "+fileName); }else{ System.out.println("无效的媒体类型. "+audioType+"不支持播放"); } } }
MP4:
packagecom.xing.design.adapter; /*** mp4只能播放MP4* @author xing* @createTime*/publicclassMp4PlayerimplementsMediaPlayer{ publicvoidplay(StringaudioType, StringfileName) { if("mp4".equals(audioType)) { System.out.println("播放 mp4 file. Name: "+fileName); }else { System.out.println("无效的媒体类型. MP4播放器不支持"+audioType+"类型播放"); } } }
我们用上述MP4播放器可以播放MP4格式的文件,不能播放MP3的:
现在我们建立一个适配器:
packagecom.xing.design.adapter; /*** 适配器* @author xing* @createTime*/publicclassMediaAdapterimplementsMediaPlayer{ /*** MP4播放器*/Mp4Playermp4Player; publicMediaAdapter(StringaudioType){ if(audioType.equalsIgnoreCase("mp4")){ mp4Player=newMp4Player(); }else { System.out.println("只可适配MP4格式,如需扩展,在此处引入。"); } } publicvoidplay(StringaudioType, StringfileName) { mp4Player.play(audioType, fileName); } }
我们在适配器中引入了Mp4Player,如果需要适配多个类型,在这里引入即可。
接下来,我们把适配器引入Mp3Player:
packagecom.xing.design.adapter; publicclassMp3PlayerimplementsMediaPlayer{ MediaAdaptermediaAdapter; publicvoidplay(StringaudioType, StringfileName) { //播放 mp3 音乐文件的内置支持if(audioType.equalsIgnoreCase("mp3")){ System.out.println("播放 mp3 file. Name: "+fileName); }elseif(audioType.equalsIgnoreCase("mp4")){ //mediaAdapter 提供了播放其他文件格式的支持mediaAdapter=newMediaAdapter(audioType); mediaAdapter.play(audioType, fileName); }else{ System.out.println("无效的媒体类型. "+audioType+"不支持播放"); } } }
测试一下:
packagecom.xing.design.adapter; publicclassAdapterPatternDemo { publicstaticvoidmain(String[] args) { // MP3播放Mp4Playermp4=newMp4Player(); System.out.println("用mp4播放器播放:"); mp4.play("mp3","2.MP3"); mp4.play("mp4","2.MP4"); Mp3Playerplayer=newMp3Player(); System.out.println("通过适配器用mp3播放器播放不同类型:"); player.play("mp3", "3.mp3"); player.play("mp4", "4.mp4"); player.play("vlc", "v.vlc"); } }
结果:
使用场景:
系统需要使用现有的类,而此类的接口不符合系统的需要。此时就建立一个可以重复使用的类(适配器),引进没有太大关联的类(要用的类),使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
总结:
适配器不是在详细设计时添加的,而是解决正在服役的项目的问题,搞一个适配器类,把不关联的接口全部引入到这个类中,这样只要使用这个适配器类就可以啦。
END