适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
-
优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。 -
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现, -
使用场景
有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
实现
- 正常运行的老接口:
public interface Play {
/**
* 播放MP3
*/
public void playMp3();
/**
* 游戏
*/
public void playGame();
}
@Slf4j
public class PlayImpl implements Play{
@Override
public void playMp3() {
log.info("play mp3");
}
@Override
public void playGame() {
log.info("贪吃蛇");
}
}
- 老接口不满足现在的需求,需要扩展功能并调整部分旧功能
/**
* @description:需要提供的所有功能列表
*/
public interface PlayMore {
/**
* 新增功能:mp4
*/
public void playMp4();
/**
* 新增功能:video
*/
public void playVideo();
/**
* 旧功能
*/
public void playMp3();
/**
* 旧功能(需重写)
*/
public void playGame();
}
@Slf4j
public class PlayMoreImpl extends PlayImpl implements PlayMore{
/**
* 重写父类游戏方法
*/
@Override
public void playGame() {
log.info("连连看");
}
/**
* 新功能实现
*/
@Override
public void playMp4() {
log.info("play mp4");
}
/**
* 新功能实现
*/
@Override
public void playVideo() {
log.info("play video");
}
}
- 调用
public class main {
public static void main(String[] args) {
PlayMore play = new PlayMoreImpl();
play.playMp4();
play.playVideo();
play.playGame();
play.playMp3();
}
}
---------------------------------------------------------------------------
16:56:51.702 [main] INFO com.yss.dataMiddle.design.adapter.PlayMoreImpl - play mp4
16:56:51.722 [main] INFO com.yss.dataMiddle.design.adapter.PlayMoreImpl - play video
16:56:51.722 [main] INFO com.yss.dataMiddle.design.adapter.PlayMoreImpl - 连连看
16:56:51.722 [main] INFO com.yss.dataMiddle.design.adapter.PlayImpl - play mp3
--------------------------------------------------------------------------