java设计模式(七)适配器模式(Adapter Pattern)

06-27 1032阅读

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、结果展示:
java设计模式(七)适配器模式(Adapter Pattern)

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]