当前位置:   article > 正文

java适配器模式_java适配器 接口适配

java适配器 接口适配

一、是什么?

定义: 将一个类的接口变成另外一个类所期待的另一个接口, 从而使因接口不匹配而无法一起工作的两个类能够一起工作

举个例子, 苹果手机想用type-c的充电器充电, 但充电接口不吻合, 所以就选哦一个转接头, 使type-c

能给苹果手机充电, 这就是适配器

二、适配器的三种实现

2.1 接口适配器模式

SpringMvc中因为handler有三种实现方式(implements Controller、implements HttpRequestHandler、@RequestMapping),要执行这三种handler的话,需要对应适配器才行。这就是接口适配器模式的实际应用之一。

下面的例子用type-c充任何电器

2.1.1类图

 2.1.2 代码实现

注:support方法判断当前适配器是否适配这个数码电器

  1. // 被适配的数码电器接口
  2. public interface DigitalAppliance {
  3. void charge();
  4. }
  5. // 耳机
  6. public class Earphone implements DigitalAppliance{
  7. @Override
  8. public void charge() { System.out.println("earphone charge...");}
  9. }
  10. // 手机
  11. public class Phone implements DigitalAppliance{
  12. @Override
  13. public void charge() { System.out.println("phone charge...");}
  14. }
  15. // Mp3
  16. public class Mp3 implements DigitalAppliance{
  17. @Override
  18. public void charge() { System.out.println("mp3 charge...");}
  19. }
  20. // 期望的接口
  21. public interface ChargeAdapter {
  22. void charge(DigitalAppliance digitalAppliance);
  23. boolean support(DigitalAppliance digitalAppliance);
  24. }
  25. // 耳机充电适配器
  26. public class EarphoneChargeAdapter implements ChargeAdapter{
  27. @Override
  28. public void charge(DigitalAppliance digitalAppliance) {
  29. System.out.println("转为Earphone充电...");
  30. digitalAppliance.charge();
  31. }
  32. @Override
  33. public boolean support(DigitalAppliance digitalAppliance) {
  34. return digitalAppliance instanceof Earphone;
  35. }
  36. }
  37. // 手机充电适配器
  38. public class PhoneChargeAdapter implements ChargeAdapter{
  39. @Override
  40. public void charge(DigitalAppliance digitalAppliance) {
  41. System.out.println("转为phone充电...");
  42. digitalAppliance.charge();
  43. }
  44. @Override
  45. public boolean support(DigitalAppliance digitalAppliance) {
  46. return digitalAppliance instanceof Phone;
  47. }
  48. }
  49. // Mp3充电适配器
  50. public class Mp3ChargeAdapter implements ChargeAdapter{
  51. @Override
  52. public void charge(DigitalAppliance digitalAppliance) {
  53. System.out.println("转为mp3充电...");
  54. digitalAppliance.charge();
  55. }
  56. @Override
  57. public boolean support(DigitalAppliance digitalAppliance) {
  58. return digitalAppliance instanceof Mp3;
  59. }
  60. }
  61. public class Typec {
  62. private static final List<ChargeAdapter> CHARGE_ADAPTERS = new ArrayList<>();
  63. static {
  64. // 获取所有的适配器
  65. CHARGE_ADAPTERS.add(new PhoneChargeAdapter());
  66. CHARGE_ADAPTERS.add(new EarphoneChargeAdapter());
  67. CHARGE_ADAPTERS.add(new Mp3ChargeAdapter());
  68. }
  69. public static void main(String[] args) {
  70. DigitalAppliance digitalAppliance = new Phone();
  71. // 获取合适的适配器
  72. ChargeAdapter chargeAdapter = getChargeAdapter(digitalAppliance);
  73. chargeAdapter.charge(digitalAppliance);
  74. }
  75. private static ChargeAdapter getChargeAdapter(DigitalAppliance digitalAppliance) {
  76. for (ChargeAdapter chargeAdapter : CHARGE_ADAPTERS) {
  77. // 判断是否适配
  78. if (chargeAdapter.support(digitalAppliance)) {
  79. return chargeAdapter;
  80. }
  81. }
  82. throw new RuntimeException("没有合适的适配器");
  83. }
  84. }

2.2 类适配器模式

Iphone所期待的充电插口可以是接口也可以是抽象类或具体类。被适配类和适配器是父子关系,适配器作为能充苹果的Typec

2.2.1 类图

 2.2.2 代码实现

  1. // 被适配的类
  2. public class TypeC {
  3. public void charge() {
  4. System.out.println("type-c充电....");
  5. }
  6. }
  7. // 期望使用的接口
  8. public interface IphoneChargeAdapter {
  9. void chargeToIphone();
  10. }
  11. // 适配器,继承Typec,把自己当成Typec,但又可以充苹果
  12. public class TypeCToIphoneAdapter extends TypeC implements IphoneChargeAdapter {
  13. @Override
  14. public void chargeToIphone() {
  15. System.out.println("转换成iphone口....");
  16. charge();
  17. }
  18. public static void main(String[] args) {
  19. // 使用
  20. IphoneChargeAdapter iphoneChargeAdapter = new TypeCToIphoneAdapter();
  21. iphoneChargeAdapter.chargeToIphone();
  22. }
  23. }
2.3 对象适配器模式

被适配类和适配器是组合关系,作为适配器的属性存在。

2.3.1 类图

在这里插入图片描述

 2.3.2 代码实现

  1. public interface IphoneChargeAdapter {
  2. void chargeToIphone();
  3. }
  4. public class TypeC {
  5. public void charge() {
  6. System.out.println("type-c充电....");
  7. }
  8. }
  9. public class TypeCToIphoneAdapter implements IphoneChargeAdapter {
  10. TypeC typeC;
  11. public TypeCToIphoneAdapter(TypeC typeC) {
  12. this.typeC = typeC;
  13. }
  14. @Override
  15. public void chargeToIphone() {
  16. System.out.println("转换成iphone口....");
  17. typeC.charge();
  18. }
  19. public static void main(String[] args) {
  20. TypeC typeC = new TypeC();
  21. IphoneChargeAdapter adapter = new TypeCToIphoneAdapter(typeC);
  22. adapter.chargeToIphone();
  23. }
  24. }

五、与装饰器模式的区别

装饰器模式的目的是在原有功能的基础之上增强扩展功能。而适配器模式的目的是将一个接口转变成另一个接口,改变原有接口的功能。

六、优点

  • 提高了类的复用,低耦合
  • 灵活性好,不想用适配器,直接删除就好,不会影响
  • 较好的扩展性,符合开闭原则

原文: Java设计模式之适配器模式_吖土豆的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/1020725
推荐阅读
相关标签
  

闽ICP备14008679号