模式说明

当前有一工具(一个已存在的类),能实现若干功能(方法),需要在某平台(目标)上使用,但与平台的接口不同(已存在的类的方法与接口方法名不同),需提供一个适配器(适配器类)转换为平台接口。这种场景可以使用适配器模式实现。与代理模式比较类似,但代理类中的RealSubjectProxy都需要实现Subject抽象类。而适配器模式中的Adaptee类是原本就已存在的类,内部的方法与接口中定义的抽象方法不同(行为一致,方法名不同)。

本示例中,以Typec为抽象目标类,其内有标准充电方法typecChange和标准数据传输方typecDataTran。现有Typeb类和Lightning类,均有自己的充电方法和数据传输方法。演示如何为他们设置适配器类,使得客户端能够通过调用适配器中的符合Typec的标准方法来间接使用TypebLightning的充电和数据传输功能(方法)。

结构

抽象目标类
定义抽象标准方法。
被适配类
有与目标类相同功能的方法,但接口(方法名)不符合标准接口(与目标类内定义的方法的方法名不同)。
适配器类
继承目标抽象类,内部持有一个被适配类实例,实现目标抽象类的抽象方法,在方法内部调用其持有的被适配类的原有方法。

代码演示

  1. package com.yukiyama.pattern.structure;
  2. /**
  3. * 适配器模式
  4. */
  5. public class AdapterDemo {
  6. public static void main(String[] args) {
  7. // 使用非标准物件时,声明其适配器
  8. Typec t1 = new AdapterB2C();
  9. Typec t2 = new AdapterL2C();
  10. // 通过调用对应适配器的标准方法,间接使用
  11. // 输出“使用TypeB接口充电”
  12. t1.typecCharge();
  13. // 输出“使用TypeB接口传输数据”
  14. t1.typecDataTrans();
  15. // 输出“使用TypeB接口充电”
  16. t2.typecCharge();
  17. // 输出“使用TypeB接口传输数据”
  18. t2.typecDataTrans();
  19. }
  20. }
  21. /**
  22. * 抽象目标类
  23. * 定义抽象标准方法。
  24. * 下例是Typec方式的充电方法和数据传输方法。
  25. */
  26. abstract class Typec{
  27. public abstract void typecCharge();
  28. public abstract void typecDataTrans();
  29. }
  30. /**
  31. * 抽象目标类的继承类
  32. * 在本模式中不是必须的,只是为了展示无需适配的情况。
  33. */
  34. class HuaweiTypeC extends Typec{
  35. @Override
  36. public void typecCharge() {
  37. System.out.println("使用TypeC接口充电");
  38. }
  39. @Override
  40. public void typecDataTrans() {
  41. System.out.println("使用TypeC接口传输数据");
  42. }
  43. }
  44. /**
  45. * 被适配类(需要适配的类)
  46. * 有与目标类相同功能的方法,但接口(方法名)不符合标准接口(与目标类内定义
  47. * 的方法的方法名不同)。
  48. * 下例是Typeb类,使用Typeb方式的充电和数据传输方法。
  49. */
  50. class Typeb{
  51. public void typebCharge() {
  52. System.out.println("使用TypeB接口充电");
  53. }
  54. public void typebDataTrans() {
  55. System.out.println("使用TypeB接口传输数据");
  56. }
  57. }
  58. /**
  59. * 适配器类
  60. * 继承目标抽象类,内部持有一个被适配类实例,实现目标抽象类的抽象方法,在
  61. * 方法内部调用其持有的被适配类的原有方法。
  62. * 下例是Typeb转Typec的适配器。
  63. */
  64. class AdapterB2C extends Typec{
  65. Typeb typeb = new Typeb();
  66. @Override
  67. public void typecCharge() {
  68. typeb.typebCharge();
  69. }
  70. @Override
  71. public void typecDataTrans() {
  72. typeb.typebDataTrans();
  73. }
  74. }
  75. /**
  76. * 被适配类(需要适配的类)
  77. * 下例是Lightning类,使用Lightning方式的充电和数据传输方法。
  78. */
  79. class Lightning{
  80. public void lightningCharge() {
  81. System.out.println("使用Lightning接口充电");
  82. }
  83. public void lightningDataTrans() {
  84. System.out.println("使用Lightning接口传输数据");
  85. }
  86. }
  87. /**
  88. * 适配器类
  89. * 下例是Lightning转Typec的适配器。
  90. */
  91. class AdapterL2C extends Typec{
  92. Lightning ln = new Lightning();
  93. @Override
  94. public void typecCharge() {
  95. ln.lightningCharge();;
  96. }
  97. @Override
  98. public void typecDataTrans() {
  99. ln.lightningDataTrans();
  100. }
  101. }