参考文献

适配器模式

  • 将一个类的接口转换为客户期望的另一个接口.

  • 适配器让类能够协同工作,否则由于接口不兼容而无法协同工作

  • 分类

    • 对象适配器
      • 对象适配器使用组合关系,在适配器类中持有一个对于被适配者类的引用,并实现目标接口的方法,通过调用被适配者类的方法来完成任务.
    • 类适配器
      • 类适配器使用继承关系,在适配器类中同时继承目标接口和被适配者类,并实现目标接口的方法.
    img

组件

  • Target 定义客户端使用的特定于域的接口
  • Adapter 使接口适配者适应目标接口
  • Adaptee 定义需要调整的现有接口
  • Client 与符合 Target 接口的对象协作

实现方式

  • 定义目标接口(Target Interface): 这是适配器的目标,即客户端所期望使用的接口.它可以是一个新的接口或者是已有的接口.

    1
    2
    3
    public interface Payment {
    void pay(double amount);
    }
    1
    2
    3
    4
    5
    6
    7
    public class PaymentSystemImpl implements Payment {
    @Override
    public void pay(double amount) {
    // 原始支付系统的支付逻辑
    System.out.println("使用原始支付系统支付:" + amount + "元");
    }
    }
  • 创建适配器类(Adapter Class): 适配器类实现了目标接口,并持有一个对于被适配者(Adaptee)对象的引用.

    • 实现适配器类: 在适配器类中,实现目标接口的方法,并在方法内部调用被适配者的相应方法来完成任务.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class AliPayAdapter implements Payment {
    private AliPay aliPay;

    public AliPayAdapter(AliPay aliPay) {
    this.aliPay = aliPay;
    }

    @Override
    public void pay(double amount) {
    aliPay.payWithAliPay(amount);
    }
    }
  • 创建被适配者类(Adaptee Class): 被适配者类是需要被适配的旧接口或者已有的类.

    1
    2
    3
    4
    5
    6
    public class AliPay {
    public void payWithAliPay(double amount) {
    // 支付宝支付的逻辑
    System.out.println("使用支付宝支付:" + amount + "元");
    }
    }
  • 在客户端中使用适配器: 在客户端中,通过适配器对象来调用适配器类中实现的目标接口方法,实现与被适配者的交互.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Main {
    public static void main(String[] args) {
    PaymentSystemImpl paymentSystem = new PaymentSystemImpl();
    paymentSystem.pay(100.0); // 使用原始支付系统支付:100.0元

    AliPay aliPay = new AliPay();
    Payment aliPayAdapter = new AliPayAdapter(aliPay);
    aliPayAdapter.pay(200.0); // 使用支付宝支付:200.0元
    }
    }

使用场景

  • 适配器模式一般常用的使用场景有:

    • 原有接口无法修改时;
    • 原有接口功能太老旧时;
    • 统一多个类的接口设计时;
    • 需要过渡升级旧接口时;
    • 需要依赖外部系统时;
    • 适配不同数据格式时;
    • 不同接口协议转换时。
  • 总结起来,适配器模式的使用场景主要有这两大类:第一类就是原有接口功能不满足现有要求,需要在兼容老接口的同时做适当的扩展;第二类是有相似性的多个不同接口之间做功能的统一。