文章目录
- 一、适配器模式定义
- 二、例子
- 2.1 菜鸟教程例子
- 2.1.1 定义两个不兼容的播放接口MediaPlayer 、AdvancedMediaPlayer
- 2.1.2 定义AdvancedMediaPlayer两个实现类VlcPlayer 、Mp4Player
- 2.1.3 定义适配器MediaAdapter
- 2.1.4 定义AudioPlayer 并使用MediaAdapter
- 2.1.5 使用
- 2.2 JDK源码——InputStreamReader
- 2.3 Spring源码——AdvisorAdapter
- 三、其他设计模式
一、适配器模式定义
别名: 门面模式
类型: 结构型模式
目的: 将不兼容的接口 通过适配器 转换成可兼容的接口。
二、例子
2.1 菜鸟教程例子
2.1.1 定义两个不兼容的播放接口MediaPlayer 、AdvancedMediaPlayer
public interface MediaPlayer {public void play(String audioType, String fileName);
}
public interface AdvancedMediaPlayer { public void playVlc(String fileName);public void playMp4(String fileName);
}
2.1.2 定义AdvancedMediaPlayer两个实现类VlcPlayer 、Mp4Player
VlcPlayer
public class VlcPlayer implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: "+ fileName); }@Overridepublic void playMp4(String fileName) {//什么也不做}
}
Mp4Player
public class Mp4Player implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) { //什么也不做 }@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: "+ fileName); }
}
2.1.3 定义适配器MediaAdapter
将AdvancedMediaPlayer 接口适配MediaPlayer 接口
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();} }@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}
2.1.4 定义AudioPlayer 并使用MediaAdapter
public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter; @Overridepublic 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");}}
}
2.1.5 使用
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");}
}
2.2 JDK源码——InputStreamReader
InputStream接口适配Reader接口
public abstract class Reader implements Readable, Closeable {public int read(CharBuffer target) throws IOException {if (target.isReadOnly())throw new ReadOnlyBufferException();int nread;if (target.hasArray()) {char[] cbuf = target.array();int pos = target.position();int rem = Math.max(target.limit() - pos, 0);int off = target.arrayOffset() + pos;nread = this.read(cbuf, off, rem);if (nread > 0)target.position(pos + nread);} else {int len = target.remaining();char[] cbuf = new char[len];nread = read(cbuf, 0, len);if (nread > 0)target.put(cbuf, 0, nread);}return nread;}}
public class InputStreamReader extends Reader {private final StreamDecoder sd;public InputStreamReader(InputStream in) {super(in);Charset cs = Charset.defaultCharset();sd = StreamDecoder.forInputStreamReader(in, lockFor(this), cs);}public int read(CharBuffer target) throws IOException {return sd.read(target);}
}
2.3 Spring源码——AdvisorAdapter
切面适配器接口。
Advisor适配MethodInterceptor 接口
public interface AdvisorAdapter {boolean supportsAdvice(Advice advice);MethodInterceptor getInterceptor(Advisor advisor);
}
实现类MethodBeforeAdviceAdapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {MethodBeforeAdviceAdapter() {}public boolean supportsAdvice(Advice advice) {return advice instanceof MethodBeforeAdvice;}public MethodInterceptor getInterceptor(Advisor advisor) {MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();return new MethodBeforeAdviceInterceptor(advice);}
}
三、其他设计模式
创建型模式
结构型模式
- 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码
行为型模式
- 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
- 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
- 3、设计模式——策略模式(Strategy Pattern)+ Spring相关源码
- 4、设计模式——状态模式(State Pattern)
- 5、设计模式——命令模式(Command Pattern)+ Spring相关源码
- 6、设计模式——观察者模式(Observer Pattern)+ Spring相关源码
- 7、设计模式——备忘录模式(Memento Pattern)
- 8、设计模式——模板方法模式(Template Pattern)+ Spring相关源码
- 9、设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码
- 10、设计模式——责任链模式(Chain of Responsibility Pattern)+ Spring相关源码
- 11、设计模式——解释器模式(Interpreter Pattern)+ Spring相关源码