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
    }
}

6、结果展示:

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部