1.定义
- 将一个接口转换为客户端希望的另外一个接口,属于结构化模型,适用于原本因接口不兼容而不能一起工作的那些类可以一起工作
2.使用场景
- 系统需要现有的类,而此类接口不符合系统需要
- 通过接口转换,将一个类插入另一个类系中
3.实现方式
- 类适配器(继承)
- 对象适配器(对象组合)
4.优缺点
-
优点
可以让任何两个没有关联的类一起运行 提高子类的复用 增加子类的透明度 灵活性好
-
缺点
过多的使用适配器,会让系统变得复杂
5.实现之对象适配器
-
实现思路
-
有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
-
我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
-
我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
-
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式
-
-
具体实现
-
为媒体播放器和更高级的媒体播放器创建接口
public interface MediaPlayer { public void play(String audioType, String fileName); } public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
-
创建实现了 AdvancedMediaPlayer 接口的实体类
public class VlcAndMp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } }
-
创建实现了 MediaPlayer 接口的适配器类。
public class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer advancedMusicPlayer=new AdvancedMediaPlayer(); @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); }else if(audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } } }
-
创建实现了 MediaPlayer 接口的实体类。
ublic 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(); mediaAdapter.play(audioType, fileName); } else{ System.out.println("Invalid media. "+ audioType + " format not supported"); } } }
-
客户端调用
public class AdapterPatternDemo { 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"); } } 执行程序,输出结果: Playing mp3 file. Name: beyond the horizon.mp3 Playing mp4 file. Name: alone.mp4 Playing vlc file. Name: far far away.vlc Invalid media. avi format not supported
-
5.实现之类适配器
-
实现思路
- 有一个适配器,一号口是typec口,二号口是vga口,只有将视频信号从typec口输入,转换输出到vga口,才能和投影仪对接,实现手机屏幕投影到投影仪上的任务
-
具体实现
-
定义一个手机Phone,它有一个Typec接口
public class Phone { public void typecPhone() { System.out.println("信息从Typec口的手机输出。"); } }
-
定义一个vga接口
public interface Vga { void vgaInterface(); }
-
实现一个Type-c转VGA适配器
public class Typec2Vga1 extends Phone implements Vga{ @Override public void vgaInterface() { // TODO Auto-generated method stub typecPhone(); System.out.println("接收到Type-c口信息,信息转换成VGA接口中..."); System.out.println("信息已转换成VGA接口,显示屏可以对接。");
-
客户端调用
Vga vga = new Typec2Vga1(); vga.vgaInterface();//适配器将typec转换成vga System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
-