应用场景
- 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
- JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
- 在 LINUX 上运行 WINDOWS 程序。
优点
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
- 在很多业务场景中符合开闭原则
缺点
-
增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱
主要组件
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目
标接口,让客户按目标接口的格式访问适配者。
结构示意图
类适配器模式,少用
对象适配器模式,常用
简要概括
- 对象适配器模式
例如,存在适配器A1、A2,都实现了适配器接口Target,那么可以通过Target接口来引用A1或A2,
样例场景
样例代码
/**
* @program: DesignPatterns
* @description:
* @author: TATE.LU
* @create: 2020-12-08 09:26
**/
public class Adapter {
public static void main(String[] args){
MediaPlayerAdapter mediaPlayerAdapter=new MediaPlayerAdapter("mp4");
mediaPlayerAdapter.play("mp4","复仇者联盟3.mp4");
mediaPlayerAdapter=new MediaPlayerAdapter("vlc");
mediaPlayerAdapter.play("vlc","miss you.vlc");
}
}
//媒体播放器接口
interface MediaPlayer{
public void play(String audioType,String fileName);
}
interface AdvancedMediaPlayer{
public void playVlc(String fileName);
public void playMp4(String fileName);
}
class VlcPlayer implements AdvancedMediaPlayer{
public void playVlc(String fileName) {
System.out.println("play vlc file. filename="+fileName);
}
public void playMp4(String fileName) {
// 什么也不做
}
}
class Mp4Player implements AdvancedMediaPlayer{
public void playVlc(String fileName) {
// 什么也不做
}
public void playMp4(String fileName) {
System.out.println("play mp4 file. filename="+fileName);
}
}
class MediaPlayerAdapter implements MediaPlayer{
private AdvancedMediaPlayer advancedMediaPlayer;
//利用构造函数,传入媒体类型再生成具体对象
public MediaPlayerAdapter(String mediaType){
if(mediaType.equals("vlc")){
advancedMediaPlayer=new VlcPlayer();
}else if(mediaType.equals("mp4")){
advancedMediaPlayer=new Mp4Player();
}
}
public void play(String audioType, String fileName) {
if(audioType.equals("vlc")){
advancedMediaPlayer.playVlc(fileName);
}else if(audioType.equals("mp4")){
advancedMediaPlayer.playMp4(fileName);
}
}
}