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