zoukankan      html  css  js  c++  java
  • 适配器模式

    我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 Mp3Player。默认情况下,Mp3Player 可以播放 mp3 格式的音频文件。

    我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放  mp4 格式的文件,也可以增加其他格式。

    我们想要让 Mp3Player 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

    Mp3Player 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo,我们的演示类使用 Mp3Player 类来播放各种格式。

    1、MP3接口

    package Adapter;
    /*
     * MP3接口
     */
    public interface MediaPlayer {
    
    	public void play(String audioType, String fileName);
    	
    }
    

      

    2、MP3实现类

    package Adapter;
    /*
     * Mp3实现类
     */
    public class Mp3Player implements MediaPlayer {
    
    	//引入媒婆:适配类
    	MediaAdapter mediaAdapter;
    
    	@Override
    	public void play(String audioType, String fileName) {
    		
    		if(audioType.equalsIgnoreCase("mp3")){
    			System.out.println("Playing mp3 file. Name: "+ fileName);
    		}
    		else if(audioType.equalsIgnoreCase("mp4")){
    			//若要让Mp3能播放Mp4,找适配器扩展Mp4
    			mediaAdapter = new MediaAdapter(audioType);
    			
    			mediaAdapter.play(audioType, fileName);
    		}
    		else{
    			System.out.println("其他");
    		}
    		
    	}
    
    }
    

      

     3、Mp4接口

    package Adapter;
    /*
     * MP4接口
     */
    public interface AdvancedMediaPlayer {
    
    	public void playMp4(String fileName);
    	
    	//其他
    }
    

    (可以定义更多方法,比如:Mp5)

    4、Mp4实现类

    package Adapter;
    /*
     * Mp4实现类
     */
    public class Mp4Player implements AdvancedMediaPlayer{
    
    	@Override
    	public void playMp4(String fileName) {
    		System.out.println("Playing mp4 file. Name: "+ fileName);
    	}
    
    }
    

     (增加Mp5实现类)

      

    5、适配类

    package Adapter;
    /*
     * 适配类:媒婆作用
     */
    public class MediaAdapter implements MediaPlayer{
    
    	//引入Mp4接口
    	AdvancedMediaPlayer advancedMediaPlayer;
    	
    	/*
    	 * 构造器:判断传进来的是Mp4还是其他,来选择new的对象
    	 */
    	public MediaAdapter(String audioType){
    		if(audioType.equalsIgnoreCase("mp4")){
    			advancedMediaPlayer = new Mp4Player();
    		}else{
    			System.out.println("Error");
    		}
    	}
    	
    
    	@Override
    	public void play(String audioType, String fileName) {
    		if(audioType.equalsIgnoreCase("mp4")){
    			advancedMediaPlayer.playMp4(fileName);
    		}else{
    			System.out.println("其他");
    		}
    		
    	}
    
    }
    

      

    (构造器里判断:如果是Mp5,new Mp5的实现类)

    (相应的,重写的play方法里也进行增加一个判断)

    6、测试类

    package Adapter;
    /*
     * 测试类
     */
    public class AdapterPatternDemo {
    
    	public static void main(String[] args) {
    		
    		Mp3Player mp3Player = new Mp3Player();
    		mp3Player.play("mp3", "alone.mp3");
    		mp3Player.play("mp4", "lonely.mp4");
    	}
    
    }
    

      

     结果:

    Playing mp3 file. Name: alone.mp3
    Playing mp4 file. Name: lonely.mp4
  • 相关阅读:
    剑指Offer——矩形覆盖
    剑指Offer——变态跳台阶
    ASCII table and description .
    字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别) .
    tchar 输入输出类 和 string 类 函数简单说明 总结各种前缀后缀
    各种 C++编译器的性能对比
    怎样写参数个数可变的宏 Debug宏 Log宏等
    C语言中的可变参数函数 三个点“…”printf( const char* format, ...)
    常用C语言字符串操作函数
    Multi-Byte Character Set & Use Unicode Character Set .
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/7675951.html
Copyright © 2011-2022 走看看