1、模式介绍:
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。
2、应用场景:
系统需要使用现有的类,而这些类的接口不符合需求。
不想修改现有的接口,而又需要复用该接口的情况。
多个类似功能的接口需要统一。
3、优点:
增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。
4、缺点:
过多使用适配器,会让系统非常零乱。
增加系统的复杂性:因为增加了额外的适配器,可能会增加系统的理解难度
5、代码实现:
/**
* 适配接口
*
* @author FM_南风
* @date 2024/6/27 13:53
*/
public interface MediaPlayer {
void play(String mediaType, String fileName);
}
/**
* 被适配者
*
* @author FM_南风
* @date 2024/6/27 13:54
*/
public class AudioPlayer implements MediaPlayer{
@Override
public void play(String mediaType, String fileName) {
if (mediaType.equalsIgnoreCase("mp3")) {
System.out.println("播放MP3文件: " + fileName);
} else {
System.out.println("使用" + mediaType + "媒体播放");
}
}
}
/**
* 新适配接口
*
* @author FM_南风
* @date 2024/6/27 13:55
*/
public interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
/**
* Mp4播放器实现新的接口
*
* @author FM_南风
* @date 2024/6/27 13:56
*/
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
}
@Override
public void playMp4(String fileName) {
System.out.println("播放MP4文件: " + fileName);
}
}
/**
* Vlc播放器实现新的接口
*
* @author FM_南风
* @date 2024/6/27 13:56
*/
public class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("播放Vlc文件: " + fileName);
}
@Override
public void playMp4(String fileName) {
}
}
/**
* 适配器类,实现目标接口并持有被适配者的引用
*
* @author FM_南风
* @date 2024/6/27 13:57
*/
public class MediaAdapter implements MediaPlayer{
AdvancedMediaPlayer advancedMusicPlayer;
public MediaAdapter(String mediaType) {
if (mediaType.equalsIgnoreCase("vlc")) {
advancedMusicPlayer = new VlcPlayer();
} else if (mediaType.equalsIgnoreCase("mp4")) {
advancedMusicPlayer = new Mp4Player();
}
}
@Override
public void play(String mediaType, String fileName) {
if (mediaType.equalsIgnoreCase("vlc")) {
advancedMusicPlayer.playVlc(fileName);
} else if (mediaType.equalsIgnoreCase("mp4")) {
advancedMusicPlayer.playMp4(fileName);
}
}
}
/**
* 应用
*
* @author FM_南风
* @date 2024/6/27 13:58
*/
public class AdapterClient {
public static void main(String[] args) {
MediaPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "音乐.mp3");
audioPlayer.play("mp4", "视频.mp4");
audioPlayer.play("vlc", "视频.vlc");
audioPlayer.play("avi", "视频.avi"); // Unsupported media type
}
}