什么是适配器模式?

适配器模式是一种结构型设计模式,其用途是将一个类的接口转换成客户端所期望的另一种接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式的实现方式

适配器模式通过创建一个实现目标接口的适配器类来实现,该适配器类存有一个对源类的实例的引用,并将请求重定向到源类的方法。通过这种方式,适配器类可以将目标接口和源接口之间的差异隐藏起来,使得它们可以协同工作。

适配器模式的优点

适配器模式能够将不兼容的接口转换为客户端所期望的接口,从而使得原本不兼容的类可以协同工作。

适配器模式的缺点

适配器模式增加了代码的复杂性,增加了额外的软件层次,并可能降低性能。

适配器模式的应用场景

适配器模式可应用于以下场景:

  • 当需要使用已有的类,但是其接口与系统所需的接口不一致时,可以通过适配器模式来创建一个适配器类。
  • 当需要重用一些现存的类,但是接口与其它环境要求不一致时,也可以使用适配器模式。

适配器模式的案例

下面我们通过一个简单的实例来展示适配器模式的应用。假设我们有一个MP3播放器和一个普通CD播放器,现在需要将普通CD播放器接口转换为MP3播放器接口,以便让普通CD播放器能够兼容MP3播放器。这个问题可以通过适配器模式来解决。

首先,定义一个目标接口MediaPlayer,该接口定义了MP3播放器所需的所有方法:

public interface MediaPlayer {public void play(String audioType, String fileName);
}

然后,定义一个源类AdvancedMediaPlayer,该类定义了普通CD播放器的接口:

public interface AdvancedMediaPlayer {public void playVlc(String fileName);public void playMp4(String fileName);
}

为了将普通CD播放器的接口转换为MP3播放器的接口,我们需要创建一个适配器类MediaAdapter,该类实现了MediaPlayer接口,并使用AdvancedMediaPlayer接口来实现其方法:

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();}}@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}

最后,我们定义一个客户端类AudioPlayer,该类实现了MediaPlayer接口,并使用MediaAdapter来适配普通CD播放器的接口:

public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter; @Overridepublic 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");}}
}

现在我们可以使用AudioPlayer来播放MP3、VLC或MP4格式的音频文件,无论它们是由MP3播放器还是普通CD播放器提供的。

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

输出结果如下:

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported

从输出结果可以看出,适配器模式使得普通CD播放器可以与MP3播放器的接口兼容,从而可以被AudioPlayer所使用。

Java 适配器模式详解相关推荐

  1. Java适配器模式详解

    文章目录 设计模式分类 适配器模式 `实例:` 小结 编程之外 设计模式分类 设计模式分为三种类型,共23种:这里先暂时只分享适配器模式的学习 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式 ...

  2. Java适配器模式详解和实际应用

    一.了解适配器模式 1.什么是适配器模式 适配器模式将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容.这种模式的主要作用就是把原本不兼容的接口,通过适配修改做到统一. 这个模式可以通过创建 ...

  3. java 适配器模式 详解(带电源插座适配 例子)

    概述: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 类型:结构型模式. 类图: 适用性: 1.你想使用一个已经存在的类,而 ...

  4. 设计模式之适配器模式详解(附应用举例实现)

    文章目录 1 适配器模式介绍 2 适配器模式详解 2.1 适配器模式结构 2.2 适配器模式实现 2.2.1 类适配器 2.2.2 对象适配器 2.3 适配器模式应用举例 3 缺省适配器模式 4 双向 ...

  5. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

  6. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  7. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  8. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  9. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

最新文章

  1. next.js_Next.js手册
  2. sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
  3. IDEA 启动 Tomcat 乱码 解决办法
  4. OpenCASCADE:Inspector简介
  5. 搭建hadoop2.6.0集群环境
  6. 多么痛的领悟--写在领英股票被腰斩之后
  7. 网络邻居无法共享解决办法
  8. 面向对象设计原则之5-接口隔离原则
  9. 牛客网--蘑菇街2016研发工程师编程题
  10. 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)
  11. linux shell 特殊符号的表示
  12. MySQL查看SQL语句执行效率
  13. 计算机网络的发展英文,计算机网络英文方向论文选题 计算机网络英文论文题目哪个好...
  14. Python:每日一题008
  15. 小样本学习记录————MAML的改进MAML++
  16. 排序链表(归并排序)
  17. 方便面又好卖了!康师傅天猫618狂增10倍,还说这只是起点
  18. 3种方式构造HTTP请求详解(HTTP4)
  19. python ui框架哪个最好用_Python UI开发最常用到的库
  20. react手机端项目注意点,ant design-mobile框架

热门文章

  1. 交付实施工程师是做什么的?
  2. HDMI协议介绍(六)--EDID
  3. stp实验心得_STP 实验
  4. c语言数组读心术,超准,一棵树的读心术
  5. 华为云服务器的使用方法
  6. superslide遇到jQuery(…).slide is not a function解决办法
  7. PCF8591模块测试
  8. 四川2020年5G规划出炉!新建3万个5G基站,实现21市州和所有县5G覆盖
  9. zlg72128数码管驱动管理显示芯片
  10. DNS?本地填写的DNS有什么用?DNS怎么工作的?