1.模式定义:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,即解决兼容问题

1.1对象适配器:

  1. class Adaptee{ //假如现在我手上有一个220v的电源头
  2. public int out220v(){
  3. return 220;
  4. }
  5. }
  6. interface Target{ //目标是需要5v的手机充电头
  7. int out5v();
  8. }
  9. class Adapter implements Target{ //这里通过类适配器进行输出转换
  10. private Adaptee adaptee;
  11. public Adapter(Adaptee adaptee) {
  12. this.adaptee = adaptee;
  13. }
  14. @Override
  15. public int out5v() {
  16. int out = adaptee.out220v();
  17. System.out.println("原电压:"+out+"v");
  18. out = 5;
  19. System.out.println("输出电压:"+out+"v");
  20. return out;
  21. }
  22. }
  23. public class AdapterTest {
  24. public static void main(String[] args) {
  25. Adaptee adaptee = new Adaptee();
  26. Target target = new Adapter(adaptee);
  27. target.out5v();
  28. }
  29. }

image.png
image.png
1.2类适配器:

  1. class Adaptee{ //假如现在我手上有一个220v的电源头
  2. public int out220v(){
  3. return 220;
  4. }
  5. }
  6. interface Target{ //目标是需要5v的手机充电头
  7. int out5v();
  8. }
  9. class Adapter extends Adaptee implements Target{ //这里通过类适配器进行输出转换
  10. @Override
  11. public int out5v() {
  12. int out = out220v();
  13. System.out.println("原电压:"+out+"v");
  14. out = 5;
  15. System.out.println("输出电压:"+out+"v");
  16. return out;
  17. }
  18. }
  19. public class AdapterTest {
  20. public static void main(String[] args) {
  21. Target target = new Adapter();
  22. target.out5v();
  23. }
  24. }

image.png
image.png
1.3类适配器和对象适配器的差别从上图就可以看出来区别了,
站在单台手机的角度来说,它只需要知道有5v就可以了,而220v是它不需要知道的,所以这里对象适配器更适合它。
但如果你站在多口充电线(八抓鱼)角度看,类适配器却是很好的选择,它本身就是要多输出口,所以要如何进行选择就要看具体的场景需求了。

1.4应用场景
1.当你希望使用某些现有类,但其接口与您的其他代码不兼容时,请使用适配器类。
2.当你希望重用几个现有的子类,这些子类缺少一些不能添加到超类中的公共功能时,请使用该模式。

1.5优点:
1.符合单一职责原则
2.符合开闭原则

1.6JDK&Spring源码中的应用
1JDK:
2java.util.Arrays#asList()
3java.util.Collections#list()
4Spring
5org.springframework.context.event.GenericApplicationListenerAdapter