定义:你可以将一个不兼容的对象包装在一个适配器中,从而使其与另一个类兼容。在软件工程中,适配器模式是一种结构型设计模式,它允许现有类的接口被用作另一个接口。它通常用于让现有类与其他类协同工作,而无需修改它们的源代码。
适用场景:
当你希望复用一些现有的类,但是他们的接口与当前系统不兼容时,可以使用适配器模式。适配器模式可以帮助你将一个类的接口转换成另一个类的接口,从而使的原本接口不兼容的类可以一起工作。
AdvancedMediaPlayer.java 高级媒体播放器接口
java
package adapter;
/**
* @Created: 2024-10-11 16:45
* @Description: 高级媒体播放器接口
*/
public interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playAvi(String fileName);
}
VlcPlayer.java Vlc播放器
java
package adapter;
/**
* @Created: 2024-10-11 16:46
* @Description: Vlc播放器
*/
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
System.out.println("playVlc");
}
@Override
public void playAvi(String fileName) {
//什么也不做
}
}
AviPlayer.java Avi播放器
java
package adapter;
/**
* @Created: 2024-10-11 16:47
* @Description: Avi播放器
*/
public class AviPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
//什么也不做
}
@Override
public void playAvi(String fileName) {
System.out.println("play Avi");
}
}
MediaAdapter.java 适配器类
java
package adapter;
/**
* @Created: 2024-10-11 16:49
* @Description: 适配器类
*/
public class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer vlcPlayer = new VlcPlayer();
AdvancedMediaPlayer aviPlayer = new AviPlayer();
@Override
public void play(String videoType, String fileName) {
if (videoType.equalsIgnoreCase("vlc")) {
vlcPlayer.playVlc(fileName);
} else if (videoType.equalsIgnoreCase("avi")) {
aviPlayer.playVlc(fileName);
}
}
}
MediaPlayer.java 媒体播放接口
java
package adapter;
/**
* @Created: 2024-10-11 16:42
* @Description: 媒体播放器接口
*/
public interface MediaPlayer {
void play(String videoType, String fileName);
}
VideoPlayer.java 视频播放器
java
package adapter;
/**
* @Created: 2024-10-11 16:53
* @Description: 视频播放器
*/
public class VideoPlayer implements MediaPlayer {
MediaPlayer mediaPlayer = new MediaAdapter();
@Override
public void play(String videoType, String fileName) {
if (videoType.equalsIgnoreCase("mp4")) {
System.out.println("播放视频播放器类");
} else if (videoType.equalsIgnoreCase("vlc") || videoType.equalsIgnoreCase("avi")) {
mediaPlayer.play(videoType, fileName);
} else {
System.out.println("not support");
}
}
}
代码逻辑:原本项目程序有播放器MediaPalyer只有一个play方法,且只能播放mp4类的视频格式,但是现在要支持播放vlc和avi格式的高级的视频格式,于是开始开发代码,不动原来的代码
定义一个新的接口AdvancedMediaPlayer,实现类为 VlcPlayer和AviPlayer支持高级格式视频播放,定义一个MediaAdapter适配器类,实现了MedaiPlayer接口,并将请求转发给AdvancedMediaPlayer对象,通过引入MediaAdapter这个中间转发层,就可以原本不支持播放高级视频的播放器,支持高级格式的视频播放;最后VideoPlayer即能播放mp4 ,有能使用MediaAdapter适配器类播放vlc和avi格式;
适配器设计模式通过创建一个中间层,使得两个不兼容的接口可以协同工作。在实际开发中,适配器模式可以帮助我们复用已有代码,提高系统的灵活性和可维护性。
参考B站视频: