适配器模式体现的原则(设计模式系列适配器模式)

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

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

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

举个例子

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

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

适配器模式体现的原则(设计模式系列适配器模式)(1)

来看一下具体代码实现

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"); } }

总结

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

本文参考 https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm

适配器模式体现的原则(设计模式系列适配器模式)(2)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页