JAVA设计模式,适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口一起工作。适配器模式主要有两种形式:类适配器和对象适配器。这两种形式都旨在解决现有类接口与所需接口不匹配的问题。

主要组成部分

  1. **Target(目标接口)**:定义客户端所期望的接口。

  2. **Adaptee(被适配的类)**:已经存在的、具有某些功能但不符合目标接口的对象。

  3. **Adapter(适配器)**:通过继承或组合的方式,将被适配者的接口转换为目标接口,从而使它们能够协同工作。

类适配器 vs 对象适配器

  • **类适配器**:通过继承实现。适配器类继承自被适配者,并实现目标接口。

  • **对象适配器**:通过组合实现。适配器类持有一个被适配者的实例,并实现目标接口。

示例代码

假设我们有一个现有的音频播放器接口,但它只能播放MP3格式的文件。现在我们需要扩展它的功能,使其能够播放VLC和MP4格式的文件。

目标接口

```java

public interface MediaPlayer {

void play(String audioType, String fileName);

}

```

被适配的类

```java

public class AudioPlayer implements MediaPlayer {

@Override

public void play(String audioType, String fileName) {

if ("mp3".equalsIgnoreCase(audioType)) {

System.out.println("Playing mp3 file. Name: " + fileName);

} else {

System.out.println("Invalid media. " + audioType + " format not supported.");

}

}

}

```

适配器接口

```java

public interface AdvancedMediaPlayer {

void playVlc(String fileName);

void playMp4(String fileName);

}

```

被适配的具体实现

```java

public class VlcPlayer implements AdvancedMediaPlayer {

@Override

public void playVlc(String fileName) {

System.out.println("Playing vlc file. Name: " + fileName);

}

@Override

public void playMp4(String fileName) {

// 不支持

}

}

public class Mp4Player implements AdvancedMediaPlayer {

@Override

public void playVlc(String fileName) {

// 不支持

}

@Override

public void playMp4(String fileName) {

System.out.println("Playing mp4 file. Name: " + fileName);

}

}

```

适配器类

```java

public class MediaAdapter implements MediaPlayer {

private 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);

}

}

}

```

客户端

```java

public class AudioPlayerDemo {

public static void main(String[] args) {

AudioPlayer audioPlayer = new AudioPlayer();

audioPlayer.play("mp3", "beyond.mp3");

audioPlayer.play("mp4", "alone.mp4");

audioPlayer.play("vlc", "far far away.vlc");

audioPlayer.play("avi", "mind me.avi");

}

}

```

运行结果

```

Playing mp3 file. Name: beyond.mp3

Playing mp4 file. Name: alone.mp4

Playing vlc file. Name: far far away.vlc

Invalid media. avi format not supported.

```

总结

适配器模式通过引入一个新的适配器类,将一个接口转换成另一个接口,从而使原本不兼容的类能够一起工作。这种模式在软件开发中非常常见,尤其是在需要集成第三方库或旧有系统时。适配器模式可以通过类适配器或对象适配器来实现,选择哪种方式取决于具体的需求和设计考虑。

相关推荐
缺点内向2 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅2 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看4 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程4 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t4 小时前
ZIP工具类
java·zip
lang201509284 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan5 小时前
第10章 Maven
java·maven
百锦再6 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说6 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多6 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring