zoukankan      html  css  js  c++  java
  • [Design Pattern] Adapter Pattern 简单案例

    Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式。 或者叫做,转换器模式。

    下面是一个转换器模式简单案例。

    假设已有 AudioPlayer 专门播放 mp3 格式文件,VlcPlayer 和 Mp4Player 是高级播放器,分别播放 vlc 和  mp4 格式文件,客户端代码调用 AudioPlayer 来播放 mp3 格式的文件。

    此时,不想修改 AudioPlayer 和 AdvanceMediaPlayer 的接口,也不希望修改客户端 AdapterPatternDemo 调用播放功能的方式,却能扩展地播放 vlc 和 mp4 格式的文件。

    通过在 AudioPlayer 和 AdvanceMediaPlayer 直接增加一层适配器,能实现需要的效果。

    代码实现:

    AdvanceMediaPlayer 接口

    public interface AdvanceMediaPlayer {
        
        public void playVlc(String fileName);
        
        public void playMp4(String fileName);
    }

    Mp4Player / VlcPlayer 类的实现,实现 AdvanceMediaPlayer 接口

    public class Mp4Player implements AdvanceMediaPlayer {
    
        @Override
        public void playVlc(String fileName) {
            // do nothing
        }
    
        @Override
        public void playMp4(String fileName) {
            System.out.println("Mp4player - playMp4 playing :" + fileName);
        }
    }
    public class VlcPlayer implements AdvanceMediaPlayer {
    
        @Override
        public void playVlc(String fileName) {
            System.out.println("VlcPlayer - playVlc playing :" + fileName);
        }
    
        @Override
        public void playMp4(String fileName) {
            // do nothings
        }
    }

    MediaPlayer 接口

    public interface MediaPlayer {
        
        public void play(String format, String fileName);
    }

    MediaAdapter ,提供播放 vlc 和 mp4 格式的转换功能

    public class MediaAdapter implements MediaPlayer {
    
        AdvanceMediaPlayer vlcPlayer;
        AdvanceMediaPlayer mp4Player;
        
        public MediaAdapter(){
            vlcPlayer = new VlcPlayer();
            mp4Player = new Mp4Player();
        }
        
        @Override
        public void play(String format, String fileName) {
            if ("vlc".equals(format)){
                vlcPlayer.playVlc(fileName);
            }
            else if ("mp4".equals(format)){
                mp4Player.playMp4(fileName);
            }
        }
    }

    AudioPlayer,内置播放 mp3 格式功能,同时内含一个适配器用于播放其他格式文件

    public class AudioPlayer implements MediaPlayer {
    
        private MediaAdapter mediaAdapter = new MediaAdapter();
        
        @Override
        public void play(String format, String fileName) {
            
            if ("mp3".equals(format)){
                System.out.println("AudioPlayer - paly : mp3 ");
            }
            else if ("mp4".equals(format) || "vlc".equals(format)){
                mediaAdapter.play(format, fileName);
            }
            else{
                System.out.println("Invalid format file");
            }
        }
    }

    演示代码,客户端 AdapterPatternDemo ,使用同一个接口、方式,即可播放除了 mp3 之外的其他格式文件。

    public class AdapterPatternDemo {
        
        public static void main(){
            AudioPlayer audioPlayer = new AudioPlayer();
            audioPlayer.play("mp3", "aaa.mp3");
            audioPlayer.play("mp4", "bbb.mp4");
            audioPlayer.play("vlc", "bbb.vlc");
            audioPlayer.play("qqq", "bbb.vlc");
        }
    }

    参考资料

    Design Patterns - Adapter Pattern, TutorialsPoint 

  • 相关阅读:
    MyEclipse 中 添加 js自动完成模版
    jQuery css,position,offset,scrollTop,scrollLeft用法
    eclipse中报错:Errors running builder “Integrated External Tool Builder” on project
    jQuery children等筛选用法
    jQuery html text val方法使用
    EventBus在Android中的简单使用
    mvc 中Range中max和min值晚绑定
    <转> Libvirt学习总结
    hdu 4409 Family Name List(LCA&有坑点)
    Mybatis 入门之resultMap与resultType解说实例
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5514679.html
Copyright © 2011-2022 走看看