前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-适配器模式

设计模式-适配器模式

原创
作者头像
堕落飞鸟
发布2023-05-03 15:35:17
3120
发布2023-05-03 15:35:17
举报
文章被收录于专栏:飞鸟的专栏

适配器模式是一种结构型设计模式,它用于将一个类的接口转换成另一个接口,以便于两个不兼容的接口能够一起工作。适配器模式有时也被称为包装器模式。

适配器模式包含以下角色:

  1. 目标接口(Target Interface):定义客户端所需的接口,这是客户端代码调用的接口。
  2. 适配器(Adapter):适配器是一个类,它实现目标接口并且包含一个对被适配对象的引用。
  3. 被适配对象(Adaptee):被适配对象是一个已经存在的对象,它的接口与目标接口不兼容。
  4. 客户端(Client):客户端通过目标接口调用适配器的方法来与被适配对象进行交互。

下面是一个适配器模式的Java代码示例:

首先定义一个目标接口:

代码语言:javascript
复制
public interface MediaPlayer {
   public void play(String audioType, String fileName);
}

接着定义一个具体的被适配对象:

代码语言:javascript
复制
public class Mp4Player {
   public void playMp4(String fileName) {
      System.out.println("Playing mp4 file. Name: "+ fileName); 
   }
}

接下来定义适配器,它实现了目标接口,并包含一个对被适配对象的引用:

代码语言:javascript
复制
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);
      }
   }
}

最后定义一个客户端,它通过目标接口调用适配器的方法来与被适配对象进行交互:

代码语言:javascript
复制
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");
      }
   }   
}

这个例子中,客户端调用了 MediaPlayer 接口的 play 方法。如果传入的文件类型是 mp3,则直接在 AudioPlayer 类中播放,否则就通过适配器模式实现播放其他格式的音频文件。当需要播放不支持的音频格式时,AudioPlayer 类会创建一个 MediaAdapter 对象,该对象可以将不支持的音频格式转换成支持的格式,然后调用 MediaPlayer 接口的 play 方法来播放该格式的音频文件。

使用适配器模式的好处是可以将两个不兼容的接口进行连接,从而实现代码的复用和扩展性的提高。如果有新的音频格式需要支持,只需要实现一个新的适配器即可。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档