专业的JAVA编程教程与资源

网站首页 > java教程 正文

阿瑟Java (36):适配器模式

temp10 2024-11-26 08:59:28 java教程 16 ℃ 0 评论

PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以点赞、收藏、关注,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!

  • 基本描述
    • 将一个类的接口转换成用户希望的另一个接口
  • 目的
    • 是使得原本由于接口不兼容,而不能一起工作的那些类,可以一起工作。
  • 主要解决
    • 在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的
  • 如何解决
    • 继承或依赖(推荐)
  • 优点
    • 可以让任何两个没有关联的类一起运行
    • 提高了类的复用和灵活性
    • 增加了类的透明度
  • 缺点
    • 过多地使用适配器,会让系统非常零乱
      • 比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。
      • 因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 实现
    • 适配器继承或依赖已有的对象,并实现想要的目标接口。
  • 使用场景
    • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
  • 角色
    • Target(目标抽象类):当前系统业务所期待的接口,它可以是抽象类或接口
    • Adaptee(适配者类):适配者即被适配的角色,它是被访问和适配的现存组件库中的组件接口。
    • Adapter(适配器类):它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
  • 适配器模式类型
    • 类适配器模式: 适配器实现目标类接口,并继承适配者类
    • 对象适配器模式:适配器实现目标类接口,并继承适配者实现类,然后目标实现类再引入适配器实现类
    • 接口适配器模式:适配者实现目标类接口,引入适配者接口,并在适配器内部实例化适配者对象,然后目标实现类再引入适配器实现类

代码示例

  • 创建适配者的接口和实现类
public interface AdvancedMediaPlayer { 
   public void playMp4(String fileName);
}
public class Mp4Player implements AdvancedMediaPlayer{
   @Override
   public void playMp4(String fileName) {
      System.out.println("Playing mp4 file. Name: "+ fileName);      
   }
}
  • 创建目标接口
public interface MediaPlayer {
   public void play(String audioType, String fileName);
}
  • 创建适配器类,实现了目标接口,按目标接口的格式访问适配者
public class MediaAdapter implements MediaPlayer {
   AdvancedMediaPlayer advancedMusicPlayer;
 
   public MediaAdapter(String audioType){      
       advancedMusicPlayer = new Mp4Player(); 
   }
 
   @Override
   public void play(String audioType, String fileName) {
         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("mp4")){
         mediaAdapter = new MediaAdapter(audioType);
         mediaAdapter.play(audioType, fileName);
      }
      else{
         System.out.println("Invalid media. "+
            audioType + " format not supported");
      }
   }   
}

阿瑟Java (36):适配器模式

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表