设计模式学习笔记--适配器模式

来源:互联网 发布:mac解压缩软件 编辑:程序博客网 时间:2024/06/05 07:41

六、适配器模式

适配器模式(Adapter Pattern)作为两个不兼容接口之间的桥梁。

简介

适配器主要用于桥接两个不同接口之间,使之能进行联动工作。

优点:可以让任何连个没有关联的类一起运行,提高了类的复用,增加了类的透明度,灵活性好。
缺点:过多的使用适配器,会造成系统凌乱。Java至多继承一个类,只能适配一个适配器类,且是抽象类。

实现

演示一个Media Player接口和实现该接口的实体类AutoPlayer。默认情况下autoplayer可以播放mp3格式音乐。
AdvancedMediaPlayer接口和实现接口的实体类,可以播放vlc和mp4文件。
若想要AutoPlayer可以播放其他格式音频,需要创建实现了MediaPlayer接口的适配器,
MediaAdapter,并使用AdvancedMediaPlayer来播放所需格式。
AutoPlayer使用适配器类MediaAdapter传递所需的音频类型,不需要知道能播放该格式音频的实际类。
AdapterPatternDemo用于演示该情景
adapter

  • 创建接口
    MediaPlayer.java
public interface MediaPlayer {  public void play(String audioType,String fileName);}

AdvancedMediaPlayer.java

public interface AdvancedMediaPlayer {  public void playVlc(String fileName);  public void playMp4(String fileName);}
  • 创建实现类
    VlcPlayer.java
public class VlcPlayer implements AdvancedMediaPlayer {  @override  public void playVlc(String fileName){    System.out.println("播放的vlc文件:" + fileName);  }  @override  public void playMp4(Sting fileName){    //因为这是Vlc播放器,就不实现mp4的功能了。  }}

Mp4Player.java

public class Mp4Player implements AdvancedMediaPlayer {  @override  public void playVlc(String fileName){    //MP4播放器,不需要实现该功能  }  @override  public void playMp4(String fileName){    System.out.println("播放MP4的文件: "+fileName);  }}
  • 创建适配器
    MediaAdapter.java
public class MediaAdapter implements MediaPlayer {    //适配器实现MediaPlayer接口,然后内部对接AdvancedMediaPlayer接口,来实现两个接口功能的衔接   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);      }   }}
  • 接口实现类
    AudioPlayer.java
public class AudioPlayer implements MediaPlayer {   MediaAdapter mediaAdapter;    @Override   public void play(String audioType, String fileName) {              //播放 mp3 音乐文件的内置支持      if(audioType.equalsIgnoreCase("mp3")){         System.out.println("Playing mp3 file. Name: "+ fileName);                }       //mediaAdapter 提供了播放其他文件格式的支持      else if(audioType.equalsIgnoreCase("vlc")          || audioType.equalsIgnoreCase("mp4")){         mediaAdapter = new MediaAdapter(audioType);         mediaAdapter.play(audioType, fileName);      }      else{         System.out.println("Invalid media. "+            audioType + " format not supported");      }   }   }
  • 演示
    AdapterPatternDemo.java
public class AdapterPatternDemo {   public static void main(String[] args) {      AudioPlayer audioPlayer = new AudioPlayer();        //原有的audioPlayer只能播放MP3,现在的扩展了adapter,实现了更多功能的播放。      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");   }}
  • 输出
Playing mp3 file. Name: beyond the horizon.mp3Playing mp4 file. Name: alone.mp4Playing vlc file. Name: far far away.vlcInvalid media. avi format not supported
0 0
原创粉丝点击