设计模式--适配器模式--简记
适配器模式(Adapter Pattern):
将一个类的接口转换成客户希望的另外一个接口。
使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
何时使用:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类。
3.通过接口转换,讲一个类插入另一个类系中。
优点:
1.可以让任何两个没有关联的类一起运行
2.提高类的复用性
3.灵活性好
缺点:
1.过多的使用适配器会让系统变的非常的凌乱,不易整体进行把握
2.由于Java至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类
注:适配器不是在详细设计中添加的,而是解决正在服役的项目
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //一个接口 2 public interface MediaPlayer { 3 public void play(String audioType, String fileName); 4 } 5 6 //另一个接口 7 public interface AdvancedMediaPlayer { 8 public void playVlc(String fileName); 9 public void playMp4(String fileName); 10 } 11 12 //实现接口的类 13 public class VlcPlayer implements AdvancedMediaPlayer { 14 @override 15 public void playVlc(String fileName) { 16 System.out.println("Playing vlc file : " + fileName); 17 } 18 19 @override 20 public void playMp4(String fileName) { 21 //do nothing 22 } 23 } 24 25 public class Mp4Player implements AdvancedMediaPlayer { 26 @override 27 public void playVlc(String fileName) { 28 //do nothing 29 } 30 31 @override 32 public void playMp4(String fileName) { 33 System.out.println("Playing mp4 file : " + fileName); 34 } 35 } 36 37 //创建实现MediaPlay接口的适配器 38 public class MediaAdapter implements MediaPlayer { 39 40 AdanceMediaPlayer advanceMusicPlayer; 41 42 public MediaAdapter(String audioType) { 43 if(audioType.equalsIgnoreCase("vlc")) { 44 advanceMusicPlayer = new VlcPlayer(); 45 } else if(audioType.equalsIgnoreCase("mp4")) { 46 advanceMusicPlayer = new Mp4Player(); 47 } 48 } 49 50 @Override 51 public void play(String audioType, String fileName) { 52 if(audioType.equalsIgnoreCase("vlc")) { 53 advanceMusicPlayer.playVlc(fileName); 54 }else if(audioType.equalsIgnoreCase("mp4")) { 55 advanceMusicPlayer.playMp4(fileName); 56 } 57 } 58 } 59 60 //创建实现了MediaPlayer接口的实现类 61 public class AudioPlay implements MeidaPlayer { 62 63 MediaAdapter mediaAdapter; 64 65 @override 66 public void play(String audioType, String fileName) { 67 if(audioType.equalsIgnoreCase("mp3")) { 68 System.out.println("Playing mp3 file : " + fileName); 69 } 70 else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) { 71 mediaAdapter = new MeidaAdapter(audioType); 72 mediaAdapter.play(audioType, fileName); 73 } 74 else { 75 System.out.println("Invalid media."); 76 } 77 } 78 } 79 80 81 //Test 82 public class AdapterPatternDemo { 83 84 public static void main(String[] args) { 85 AudioPlayer audioPlayer = new AudioPlayer(); 86 87 audioPlayer.play("mp3","beyond the horizon.mp3"); 88 audioPlayer.play("mp4","alone.mp4"); 89 audioPlayer.play("vlc","far far.vlc"); 90 audioPlayer.play("avi","mind me.avi"); 91 } 92 }
详情:http://www.runoob.com/design-pattern/adapter-pattern.html