• 六、结构型 适配器模式(Adapter Pattern)


    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

    在这里插入图片描述

    1. 高级媒体播放器
    /**
     * 高级媒体播放器接口
     *
     * @author 吴尚慧
     * @since 2022/6/21 11:43
     */
    public interface AdvancedMediaPlayer {
    
        public void playVlc(String fileName);
    
        public void playMp4(String fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    /**
     * Mp4 播放器
     * 
     * @author 吴尚慧
     * @since 2022/6/21 11:44
     */
    public class Mp4Player implements AdvancedMediaPlayer {
    
        @Override
        public void playVlc(String fileName) {
            //什么也不做
        }
    
        @Override
        public void playMp4(String fileName) {
            System.out.println("Playing mp4 file. Name: " + fileName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    /**
     * Vlc 播放器
     * 
     * @author 吴尚慧
     * @since 2022/6/21 11:44
     */
    public class VlcPlayer implements AdvancedMediaPlayer {
        @Override
        public void playVlc(String fileName) {
            System.out.println("Playing vlc file. Name: " + fileName);
        }
    
        @Override
        public void playMp4(String fileName) {
            //什么也不做
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    播放器统一的入口

    /**
     * 媒体播放器接口
     *
     * @author 吴尚慧
     * @since 2022/6/21 11:41
     */
    public interface MediaPlayer {
    
        /**
         * 播放
         *
         * @param audioType 音频格式
         * @param fileName 文件名
         */
        public void play(String audioType, String fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    写一个适配器类,来适配高级媒体播放器

    /**
     * 高级媒体适配器类
     * 
     * @author 吴尚慧
     * @since 2022/6/21 11:45
     */
    public class MediaAdapter implements MediaPlayer {
    
        AdvancedMediaPlayer advancedMusicPlayer;
    
        public MediaAdapter(String audioType) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMusicPlayer = new VlcPlayer();
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMusicPlayer = new Mp4Player();
            }
        }
    
        @Override
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMusicPlayer.playVlc(fileName);
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMusicPlayer.playMp4(fileName);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    播放器入口

    /**
     * 声音播放器
     * 
     * @author 吴尚慧
     * @since 2022/6/21 11:46
     */
    public class AudioPlayer implements MediaPlayer {
    
        MediaAdapter mediaAdapter;
    
        @Override
        public void play(String audioType, String fileName) {
    
            //播放 mp3 音乐文件的内置支持
            if (audioType.equalsIgnoreCase("mp3")) {
                System.out.println("Playing mp3 file. Name: " + fileName);
            }
            //mediaAdapter 提供了播放其他文件格式的支持
            else if (audioType.equalsIgnoreCase("vlc")
                    || audioType.equalsIgnoreCase("mp4")) {
                mediaAdapter = new MediaAdapter(audioType);
                mediaAdapter.play(audioType, fileName);
            } else {
                System.out.println("Invalid media. " +
                        audioType + " format not supported");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    测试类

    /**
     * 测试类
     *
     * @author 吴尚慧
     * @since 2022/6/21 11:46
     */
    public class AdapterPatternDemo {
    
        public static void main(String[] args) {
            AudioPlayer audioPlayer = new AudioPlayer();
    
            audioPlayer.play("mp3", "beyond the horizon.mp3");
            audioPlayer.play("mp4", "alone.mp4");
            audioPlayer.play("vlc", "far far away.vlc");
            audioPlayer.play("avi", "mind me.avi");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果:

    Playing mp3 file. Name: beyond the horizon.mp3
    Playing mp4 file. Name: alone.mp4
    Playing vlc file. Name: far far away.vlc
    Invalid media. avi format not supported
    
    • 1
    • 2
    • 3
    • 4

    参考:
    https://www.runoob.com/design-pattern/design-pattern-intro.html

  • 相关阅读:
    Win安装Nacos
    分享积分兑换小程序开发制作功能介绍
    Stable Diffusion 3震撼发布模型与Sora同架构
    基于JavaSwing开发远程控制系统 课程设计 大作业源码 毕业设计
    vcpkg安装第三方库,报错fatal error RC1107: invalid usage; use RC /? for Help
    3.5背景图像固定(背景附着)
    0601STM32TIM
    【Python零基础入门笔记 | 12】程序员为什么自嘲面向Bug编程?
    自动化办公篇之python批量改名
    QT实现将两个时间相加的算法[hh: mm + hh: mm]
  • 原文地址:https://blog.csdn.net/weixin_45847167/article/details/125466941