文章目录
- 介绍
- 开始
- 使用委托的适配器(媒体播放器)
- 架构图
- 定义被适配者
- 定义需求接口
- 定义适配者
- 使用继承的适配器(手机充电接口)
- 架构图
- 定义被适配者
- 定义需求接口
- 定义适配者
- 测试样例
- 总结
- 优点
- 缺点
介绍
在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”
和“所需的程序”
之间差异的设计模式就是Adapter模式
。
Adapter模式也被称为 Wrapper模式
。Wrapper有“包装器”的意思,就像用精美的包装纸将普通商品包装成礼物那样,替我们把某样东西包起来,使其能够用于其他用途的东西就被称为“包装器”
或是“适配器”
。
Adapter模式有以下两种。
- 对象适配器模式(使用委托的适配器)
- 类适配器模式(使用继承的适配器)
开始
使用委托的适配器(媒体播放器)
架构图
定义被适配者
public interface AdvancedMediaPlayer {/*** 播放视频** @param fileName*/void specificPlay(String fileName);}
@Service
public class MP4Player implements AdvancedMediaPlayer {@Overridepublic void specificPlay(String fileName) {System.out.println("播放 mp4 格式的媒体 , 文件名 : " + fileName);}
}
@Service
public class WmvPlayer implements AdvancedMediaPlayer {@Overridepublic void specificPlay(String fileName) {System.out.println("播放 wmv 格式的媒体 , 文件名 : " + fileName);}}
定义需求接口
public interface MediaPlayer {/*** 播放媒体,这里由于有很多的媒体类型,通过type解决 类型不同。* 因此,这里衍生可以加上工厂解决这个type问题** @param audioType* @param fileName*/void play(String audioType, String fileName);
}
定义适配者
@Service
public class MediaAdapter implements MediaPlayer {@Resourceprivate Map<String, AdvancedMediaPlayer> advancedMediaPlayerMap;@Overridepublic void play(String audioType, String fileName) {AdvancedMediaPlayer advancedMediaPlayer = advancedMediaPlayerMap.get(audioType);if (Objects.isNull(advancedMediaPlayer)) {System.out.println("当前类型暂不支持,无法播放~~~~~");} else {advancedMediaPlayer.specificPlay(fileName);}}}
使用继承的适配器(手机充电接口)
架构图
定义被适配者
public interface RechargerAdaptee {void specificRecharger();
}
@Service
public class LightningAdaptee implements RechargerAdaptee {@Overridepublic void specificRecharger() {System.out.println("完成 lightning 接口的充电");}
}
@Service
public class TypeCAdaptee implements RechargerAdaptee {@Overridepublic void specificRecharger() {System.out.println("完成 type C 接口的充电");}
}
定义需求接口
public interface LightningConnector {void lightningRecharger();
}
public interface TypeCConnector {void typeCRecharger();
}
定义适配者
@Service
public class LightningAdapter extends TypeCAdaptee implements LightningConnector {@Overridepublic void lightningRecharger() {System.out.println("---------------lightning 转 type C 接口~适配器开始工作-------------------");super.specificRecharger();}}
@Service
public class TypeCAdapter extends LightningAdaptee implements TypeCConnector {@Overridepublic void typeCRecharger() {System.out.println("---------------type C 转 lightning 接口~适配器开始工作-------------------");super.specificRecharger();}}
测试样例
@Slf4j
@SpringBootTest(classes = AdapterApplication.class)
public class TestAdapter {@Resourceprivate LightningAdapter lightningAdapter;@Resourceprivate TypeCAdapter typeCAdapter;@Resourceprivate MediaAdapter mediaAdapter;@Testpublic void testRechargerAdapter() {lightningAdapter.lightningRecharger();System.out.println("----------------------------------");typeCAdapter.typeCRecharger();}@Testpublic void testMediaAdapter() {mediaAdapter.play("MP4Player","1.MP4");mediaAdapter.play("wmvPlayer","2.wmv");mediaAdapter.play("swfPlayer","3.swf");}}
总结
将一个类的接口转换成客户希望的另外一个接口。Adapter模式
使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
优点
- 促进了类之间的协同工作,即使它们没有直接的关联。
- 提高了类的复用性。
- 增加了类的透明度。
- 提供了良好的灵活性。
缺点
- 过度使用适配器可能导致系统结构混乱,难以理解和维护。
- 在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。