Skip to content

适配器模式 高频

适配器模式(Adapter Pattern)用于将一个类的接口转换成客户端期望的另一个接口,使原本因接口不兼容而无法一起工作的类能够协同工作。

优缺点

优点缺点
解决接口不兼容问题,提高代码复用增加系统复杂度
符合开闭原则,不修改原有代码过多适配器降低可读性和可维护性
客户端与适配者解耦对象适配器有额外方法调用开销
对象适配器灵活性高,可适配适配者及其子类(此栏为空)

适用场景

  • 接口不兼容,现有类无法直接使用,需适配对接时
  • 想复用现有类但不愿或不能修改其源码时
  • 多个类功能相似但接口各异,需统一调用方式时
  • 外部组件接口与系统不一致时

两种实现方式

类型实现方式优点适用场景
类适配器继承适配者 + 实现目标接口可重写适配者行为单继承语言(Java不支持多继承,用接口实现)
对象适配器持有适配者引用 + 实现目标接口更灵活(可适配多个适配者及其子类)更常用

类适配器

Java
// 目标接口:手机需要的5V电压
interface Phone {
    void charge5V();
}

// 适配者:家里220V插座
class Power220V {
    void charge220V() {
        System.out.println("220V交流电输出");
    }
}

// 类适配器:充电头(继承220V插座 + 实现手机接口)
class ChargerAdapter extends Power220V implements Phone {
    @Override
    public void charge5V() {
        charge220V();        // 接收220V
        System.out.println("→ 转换成5V直流电 → 手机充电中");
    }
}

// 使用
public class Demo {
    public static void main(String[] args) {
        Phone phone = new ChargerAdapter();
        phone.charge5V();  // 直接用5V接口充电
    }
}

对象适配器

Java
// 目标接口:手机需要的5V电压
interface Phone {
    void charge5V();
}

// 适配者:家里220V插座
class Power220V {
    void charge220V() {
        System.out.println("220V交流电输出");
    }
}

// 对象适配器:充电头(持有适配者对象,而非继承)
class ChargerAdapter implements Phone {
    private Power220V power;  // 通过组合持有适配者
    
    public ChargerAdapter(Power220V power) {
        this.power = power;
    }
    
    @Override
    public void charge5V() {
        power.charge220V();    // 调用适配者的方法
        System.out.println("→ 转换成5V直流电 → 手机充电中");
    }
}

// 使用
public class Demo {
    public static void main(String[] args) {
        Power220V socket = new Power220V();
        Phone phone = new ChargerAdapter(socket);  // 把插座塞进充电头
        phone.charge5V();
    }
}

如有转载或 CV 请标注本站原文地址