• 结构型设计模式(一)适配器模式


    一、一句话背景

    假如我有一个只能播放mp3格式文件的播放器,随着时代发展,我想要播放.mp4或者.avi各种格式的文件,那么这个时候可以采用适配器模式。

    PS:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

    二、使用场景

    有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

    如:一个正在使用的接口需要兼容新的功能。

    三、模型分析

    基础媒体播放器:模拟正在使用的接口

    高级媒体播放器 : 模拟定义了新功能的接口

    适配器:提供对接新功能的方法

    支持各种类型的播放器:播放器的具体内部实现

    四、代码分析

    基础媒体播放器

    /**
     * 媒体播放器,定义了播放文件的方法
     */
    public interface MediaPlayer {
        public void play(String audioType, String fileName);
    }

    高级媒体播放器

    /**
     * 更高级的媒体播放器,定义了播放VLC格式文件和播放MP4格式文件的方法
     */
    public interface AdvancedMediaPlayer {
        public void playVlc(String fileName);
    
        public void playMp4(String fileName);
    }

    支持各种类型的播放器

    /**
     * MP4媒体播放器
     */
    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);
        }
    }
    /**
     * VLC媒体播放器
     */
    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) {
            //什么也不做,没法播这个格式的,哈哈哈
        }
    }

    适配器

    /**
     * 适配器
     */
    public class MediaAdapter implements MediaPlayer {
    
        AdvancedMediaPlayer advancedMusicPlayer;
    
        //构造方法,根据文件格式audioType调用(生成)不同的播放器对象
        public MediaAdapter(String audioType) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMusicPlayer = new VlcPlayer();
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMusicPlayer = new Mp4Player();
            }
        }
    
        //据文件格式audioType选择不同的播放器进行解析
        @Override
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMusicPlayer.playVlc(fileName);
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMusicPlayer.playMp4(fileName);
            }
        }
    }

    用户使用的媒体播放器

    /**
     * 用户使用的产品,媒体播放器的实现
     */
    public class AudioPlayer implements MediaPlayer {
        MediaAdapter mediaAdapter;
    
        @Override
        public void play(String audioType, String fileName) {
    
            if (audioType.equalsIgnoreCase("mp3")) {
                //播放 mp3 音乐文件的内置支持
                System.out.println("Playing mp3 file. Name: " + fileName);
            } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
                //mediaAdapter适配器  提供了播放其他文件格式的支持
                mediaAdapter = new MediaAdapter(audioType);
                mediaAdapter.play(audioType, fileName);
            } else {
                System.out.println("Invalid media. " + audioType + " format not supported");
            }
        }
    }

    模拟使用

    /**
     * 使用 AudioPlayer 来播放不同类型的音频格式。
     */
    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");
        }
    }

    调用结果

  • 相关阅读:
    安装devstack之配置proxy
    设备信息表项目
    好的运维工程师
    rhel 6.4 增加光盘为yum repo
    深度运维产品工具关键词
    坚持是一种能力
    书单 电影单 电视剧单
    三日不读书,便觉得言语无味,面目可憎
    STAR法则
    【断舍离】
  • 原文地址:https://www.cnblogs.com/riches/p/11226706.html
Copyright © 2020-2023  润新知