Java设计模式——适配器模式
⚪适配器模式(Adapter)是一种结构型设计模式。
⚪意图:将一个类的接口转换成另一个类的接口,以满足客户端的需求。它允许不同接口的类能够一起工作。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- 目标接口(Target):客户端需要的接口,适配器模式的目标是使客户端能够使用这个接口。
- 适配器类(Adapter):实现了目标接口,并包含了要被适配的类的实例,它充当了连接目标接口和被适配接口的桥梁。
- 被适配的类(Adaptee):需要被适配以满足目标接口的类。
▷ 工作流程:
- 客户端通过目标接口与适配器进行交互。
- 适配器内部持有被适配的类的实例。
- 当客户端调用目标接口的方法时,适配器将请求委派给被适配的类的相应方法,完成适配。
▷ 示例
// 目标接口
interface MediaPlayer {
void play(String audioType, String fileName);
}
// 被适配的类
class Mp3Player implements MediaPlayer {
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing MP3 file: " + fileName);
}
}
}
// 适配器类
class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer = new Mp4Player();
} else if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer = new VlcPlayer();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMp4(fileName);
} else if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer.playVlc(fileName);
}
}
}
// 被适配的类之一
interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing VLC file: " + fileName);
}
@Override
public void playMp4(String fileName) {
// 不支持
}
}
class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
// 不支持
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing MP4 file: " + fileName);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
MediaPlayer mediaPlayer = new MediaAdapter("mp4");
mediaPlayer.play("mp4", "movie.mp4");
mediaPlayer = new MediaAdapter("vlc");
mediaPlayer.play("vlc", "video.vlc");
mediaPlayer = new MediaAdapter("mp3");
mediaPlayer.play("mp3", "audio.mp3");
}
}
⚪适用性
- 想使用一个已经存在的类,而它的接口不符合要求。
- 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- (仅适用于对象 Adapter )想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
⚪应用场景
- 接口不兼容:当现有的类的接口与系统的要求不兼容时,适配器模式可以帮助将这些类集成到系统中。
- 旧系统和新系统集成:当需要将旧系统的功能集成到新系统中,但旧系统的接口与新系统不兼容时,适配器模式可以用来使二者协同工作。
- 第三方库或组件的集成:当你需要使用第三方库或组件,但它们的接口与你的应用程序不匹配时,适配器可以将这些库或组件集成到你的应用程序中。
⚪实际已有场景
- I/O流:Java中的InputStream和OutputStream类是一个很好的适配器模式的例子。它们提供了一个通用的接口来读写不同类型的数据源,如文件、网络连接等。
- Swing GUI编程:Swing GUI库中经常使用适配器模式来处理事件处理。例如,ActionListener接口用于处理按钮点击事件,但是可以使用适配器类ActionAdapter来实现它,以便只覆盖你感兴趣的事件处理方法。
- Spring AOP:在Spring框架中,AOP(面向切面编程)允许你通过创建切面(包含通知和切点)来在应用程序中添加横切关注点。通知是实际行为,但是在Spring中,通知的类型和触发点之间的关系需要使用适配器来实现。
- Spring MVC:Spring MVC控制器通常接受HTTP请求,并将其转换为方法调用。这是通过处理器适配器(HandlerAdapter)实现的,它将HTTP请求适配为控制器可以处理的形式。
- Spring消息队列:Spring框架支持与各种消息队列系统(如RabbitMQ、Kafka)的集成。适配器用于将Spring应用程序的消息发送和接收与特定消息队列系统的API适配。

浙公网安备 33010602011771号