java设计模式-适配器设计模式
简单说一下(定义、举例)
什么是适配器设计模式:将一个接口转换成客户希望的另一个接口,使得原本由于接口不兼容
而不能一起工作的那些类能一起工作,其别名为包装器(Wrapper)。简言之就是两个不兼容
的接口之间的桥梁。
举个栗子:一个只会Chinese的中国人和一个只会English的英国人进行交谈,如果他们想正常
交谈,他们需要通过一个既会Chinese、又会English的人翻译来进行沟通交流。
稍微夸一下(优、缺点)
适配器设计模式的优点:
1.透明度:客户端通过适配器可以透明的调用目标接口
2.复用性:复用了现存的类,程序员不需要修改原有代码而重用现有的适配器者类
3.解耦性:将目标类与适配者类解耦,解决了目标类与适配者类接口不一致的问题
适配器设计模式的缺点:
1.对适配器来说,过多的使用适配器会让系统凌乱,而且更换适配器的实现过程比较复杂
2.由于java单继承的特性,所以至多适配一个适配者类,而且目标类必须是抽象类
顺便提一下(使用场景、何时使用)
1.使用场景
有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式
2.何时使用
**·**系统需要使用现有的类,但是现有的类的接口不符合系统的需求
**·**想建立一个重复使用的类,用于与彼此之间没有太大关联的一些类,这些原类不一定有一 致的接口
**·**通过接口转换,将一个类插入另一个类中
详细讲一下(模型结构)
模式结构主要分为以下角色:
1.目标接口:当前系统业务所期待的接口,他可以是抽象类或者接口
2.适配者类:将被访问和适配的现存组件库中的组件接口
3.适配器类:相当于转换器,通过继承或者引用适配的对象,把适配者接口转化成目标接口,让客户按照目标接口的格式访问适配者
可以根据下图理解:一图走天下(网上当的)
多多用一下(代码实现)
1.为媒体播放器和更高级的媒体播放器创建接口MediaPlayer.java,AdvanceMediaPlayer.java
public interface MediaPlayer {
public void play(String audioType,String fileName);
}
-------------------------------------------------------------
public interface AdvanceMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
创建实现了 AdvancedMediaPlayer 接口的实体类VlcPalyer.java , Mp4Player.java
public class VlcPlayer implements AdvanceMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file.Name"+fileName);
}
@Override
public void playMp4(String fileName) {
}
}
-------------------------------------------------------------
public class Mp4Player implements AdvanceMediaPlayer {
@Override
public void playVlc(String fileName) {
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file.Name:"+fileName);
}
}
3.创建实现了 MediaPlayer 接口的适配器类MediaAdapter.java
public class MediaAdapter implements MediaPlayer {
AdvanceMediaPlayer advanceMediaPlayer;
public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase("vlc")){
advanceMediaPlayer = new VlcPlayer();
}else if(audioType.equalsIgnoreCase("mp4")){
advanceMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("vlc")){
advanceMediaPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase("mp4")){
advanceMediaPlayer.playMp4(fileName);
}
}
}
4.创建实现了 MediaPlayer 接口的实体类AudioPlayer.java
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 support");
}
}
}
5.使用 AudioPlayer 来播放不同类型的音频格式AdapterPatternDemo.java
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");
}
}