• 需求:
      • 我们手头有有一套系统 v1.0 版本的老代码,现在要在这个基础之上构建 v2.0 的新代码。然后有了一个新的接口,需要让别人面向新接口开发,此时就只能开发适配器,适配 v1.0 版本的类,但是实现的是 v2.0 的接口,别人调用 v2.0 的接口,内部却是基于 v1.0 的老类实现的功能;

    image.png

    1. package com.example.designpattern.adapter;
    2. public class AdapterPatternDemo {
    3. public static void main(String[] args) {
    4. NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
    5. NewInterface newObject = new NewInterfaceImpl();
    6. oldObject.newExecute();
    7. newObject.newExecute();
    8. // 适配器模式
    9. // 就是你手上有新老俩接口和一个老接口的实现类
    10. // 但是现在系统中要面向新接口来开发,老接口的实现类就不能直接用了,不能直接面向老接口来开发
    11. // 开发一个老接口到新接口的一个适配器
    12. // 适配器是实现了新接口的,但是适配器中持有老接口实现类实例的引用
    13. // 适配器的新接口方法的实现,全部基于老接口实现类的老方法来实现即可
    14. // 对于调用方而言,只要使用适配器来开发即可,就可以通过面向新接口开发,底层使用老接口实现类
    15. }
    16. /**
    17. * 定义一个适配器类
    18. */
    19. public static class NewInterfaceAdapter implements NewInterface {
    20. OldInterface oldObject;
    21. public NewInterfaceAdapter(OldInterface oldObject) {
    22. this.oldObject = oldObject;
    23. }
    24. public void newExecute() {
    25. oldObject.oldExecute();
    26. }
    27. }
    28. public static interface NewInterface {
    29. void newExecute();
    30. }
    31. public static class NewInterfaceImpl implements NewInterface {
    32. public void newExecute() {
    33. System.out.println("新版本接口实现的功能逻辑");
    34. }
    35. }
    36. public static interface OldInterface{
    37. void oldExecute();
    38. }
    39. public static class OldInterfaceImpl implements OldInterface {
    40. public void oldExecute() {
    41. System.out.println("老版本接口实现的功能逻辑");
    42. }
    43. }
    44. }
    • 在实际企业开发中的使用场景
      • 这个模式一般是在系统不断升级的过程中使用,对已经写好的老的类,写一套适配器来适配老类,但是提供新的接口;
      • 还有一种情况,是对于已有的第三方类库,比如 redis 的客户端,或者是 elasticsearch 的客户端,他们提供了一套 API,但是我们这里的要求是需要面向我们这里的 DAO 接口来进行编程,此时可以写一个适配器,将比如 redis 客户端的接口适配到我们的接口;
        • 比如我们的 DAO 接口,要求的接口风格都是:save、update、remove、list、get,这些方法风格;
        • DaoRedisImpl,redis客户端,get、set、mset、mget,一套接口;适配器,DaoRedisImpl 就是一个适配器,这个适配器实现的是我们的 DAO 接口,在我们的 save、update、remove 等方法中,去调用 redis 客户端的 get、set、mset、mget 等方法;