什么是适配器模式?

两个不兼容的接口之间的桥梁,双方无法直接调用的时候,第三方提供适配能力。
两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。

适用场景

双方直接配合无法进行时,使用适配器模式,对其中一方进行适配。
一方适配另一方的接口

代码实现

案例:VGA转USB适配器
某苹果电脑只有USB接口,现在有个显示器需要VGA接口,提供扩展坞,USB适配VGA接口

  1. /**
  2. * USB
  3. */
  4. interface USB {
  5. void usb();
  6. }
  7. /**
  8. * USB具体实现
  9. */
  10. class USBImpl implements USB {
  11. @Override
  12. public void usb() {
  13. System.out.println("USB协议");
  14. }
  15. }
  16. /**
  17. * 苹果电脑只有USB接口
  18. */
  19. class Mac {
  20. /**
  21. * 播放
  22. */
  23. public void play(USB usb) {
  24. usb.usb();
  25. }
  26. }
  27. //现在有VGA,需要适配器
  28. /**
  29. * VGA
  30. */
  31. interface VGA {
  32. void vga();
  33. }
  34. /**
  35. * VGA具体实现
  36. */
  37. class VGAImpl implements VGA {
  38. @Override
  39. public void vga() {
  40. System.out.println("VGA协议");
  41. }
  42. }
  43. //方式一:使用继承
  44. /**
  45. * VGA转USB适配器
  46. */
  47. class VGA2USBAdapter extends VGAImpl implements USB {
  48. @Override
  49. public void usb() {
  50. super.vga();
  51. }
  52. }
  53. //方式二:使用组合
  54. /**
  55. * VGA转USB适配器
  56. */
  57. class VGA2USBAdapter2 implements USB {
  58. private final VGA vga = new VGAImpl();
  59. @Override
  60. public void usb() {
  61. vga.vga();
  62. }
  63. }
  64. /**
  65. * 适配器模式测试
  66. */
  67. public class AdapterPattern {
  68. public static void main(String[] args) {
  69. //Mac电脑插入USB
  70. Mac mac = new Mac();
  71. USB usb = new USBImpl();
  72. mac.play(usb);
  73. //插入适配器VGA转USB
  74. USB vga2USBAdapter = new VGA2USBAdapter();
  75. mac.play(vga2USBAdapter);
  76. }
  77. }