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 

  • 相关阅读:
    组合和继承
    解决不了问题
    [zz]shared_ptr 在 stl容器中排序的陷阱
    char ** 初始化
    [zz]c++ list sort方法
    [zz]ZeroMQ的学习和研究
    shared_prt自己使用记录
    rapidxml使用笔记
    HDOJ_ACM_I love sneakers!
    HDOJ_ACM_PiggyBank
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5514679.html
Copyright © 2011-2022 走看看