设计模式(7)--适配器模式

来源:互联网 发布:电脑绑定mac地址 编辑:程序博客网 时间:2024/06/05 07:24

什么是适配器模式?
适配器模式是一种行为型模式,是作为两个不兼容的接口之间的桥梁。例如电源的适配器,接口的适配器等等。

什么时候使用适配器?
适配器模式并不是一个经常使用的设计模式, 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何实现适配器?

public interface MediaPlayer {    public void play(String audioType, String fileName);}
public interface AdvancedMediaPlayer {    public void playVlc(String fileName);    public void playMp4(String fileName);}
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);    }}
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");        }    }}
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);        }    }}

测试客户端

public class Client {    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");    }}

从这个例子可以看到适配器的核心就是,根据需求的不同,找到不同的处理类,本身类似于java的多态机制。

原创粉丝点击