适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。
系统需要使用现有的类,而这些类的接口不符合需求。
不想修改现有的接口,而又需要复用该接口的情况。
多个类似功能的接口需要统一。
增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。
过多使用适配器,会让系统非常零乱。
增加系统的复杂性:因为增加了额外的适配器,可能会增加系统的理解难度
- /**
- * 适配接口
- *
- * @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
- }
- }