适配器模式
描述
适配器的理解很简单,举个例子:我们都见过存储卡,一般手机都可以装上存储卡,手机可以对存储卡直接读写,但是如果想用电脑读写存储卡呢?那就需要一个媒介---卡托,把存储卡插在卡托上,卡托上有个USB的数据口,而所有电脑都支持USB口,这样就可以用电脑读写存储卡内容了。卡托这个神器就是一种适配器。适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模式。
适配器模式比较官方的概念是:是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
例子
假设有两个播放器AudioPlayer和VideoPlayer,其中AudioPlayer能够播放所有音频文件(如.mp3),VideoPlayer能播放所有视频文件(如.mp4)。但是如果在AudioPlayer中输入一个.mp4的文件,它是不能识别不能播放的,同理,在VideoPlayer中放入.mp3文件也是不可以识别的。
现在我们通过适配器模式,实现一个基于AudioPlayer和VideoPlayer适配器,我们把一个文件放入适配器中,不论是音频还是视频,都可以正常播放。
interface Player { public void play(String type, String fileName); } interface AudioPlayer { public void playAudio(String fileName); } interface VideoPlayer { public void playVideo(String fileName); } class MyAudioPlayer implements AudioPlayer { @Override public void playAudio(String fileName) { System.out.println("Playing. Name: "+ fileName); } } class MyVideoPlayer implements VideoPlayer { @Override public void playVideo(String fileName) { System.out.println("Playing. Name: "+ fileName); } } class MyPlayer implements Player { AudioPlayer audioPlayer = new MyAudioPlayer(); VideoPlayer videoPlayer = new MyVideoPlayer(); public MyPlayer(){ } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("avi")){ videoPlayer.playVideo(fileName); }else if(audioType.equalsIgnoreCase("mp3")){ audioPlayer.playAudio(fileName); } } } public class Main{ public static void main(String[] args) { MyPlayer myPlayer = new MyPlayer(); myPlayer.play("mp3", "h.mp3"); myPlayer.play("avi", "me.avi"); } }
输出结果:
Playing. Name: h.mp3
Playing. Name: me.avi