适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目的是将一个类的接口转换成客户期望的另一个接口,从而使原本接口不兼容的类可以协同工作。适配器模式常用于解决现有代码与新需求之间的兼容性问题。

适配器模式的核心要素

  • 目标接口(Target Interface)
    客户端期望使用的接口。
  • 需要适配的类(Adaptee)
    具有不兼容接口的类。
  • 适配器(Adapter)
    一个中间类,通过实现目标接口并包装被适配的类,使两者能够兼容。

分类

  • 类适配器(基于继承)
    适配器通过继承需要适配的类并实现目标接口完成适配。这种方式要求适配器不能同时继承其他类(因为 Java 中不支持多继承)。
  • 对象适配器(基于组合)
    适配器通过组合需要适配的类并实现目标接口来完成适配,更灵活,推荐使用。
  • 接口适配器(缺省适配器模式)
    提供一个抽象类实现目标接口中的所有方法,具体适配器只需覆盖需要的方法即可,适用于接口方法较多的情况。

类适配器示例

// 目标接口
interface Target {
    void request();
}

// 被适配的类
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee: Handling specific request.");
    }
}

// 适配器类
class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest(); // 调用被适配类的方法
    }
}

// 测试
public class Main {
    public static void main(String[] args) {
        Target adapter = new Adapter();
        adapter.request();
    }
}

对象适配器示例

// 目标接口
interface Target {
    void request();
}

// 被适配的类
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee: Handling specific request.");
    }
}

// 适配器类
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest(); // 调用被适配类的方法
    }
}

// 测试
public class Main {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target adapter = new Adapter(adaptee);
        adapter.request();
    }
}

接口适配器(缺省适配器模式)

// 定义一个包含多个方法的接口
interface Target {
    void method1();
    void method2();
    void method3();
}

// 提供一个抽象类实现接口中的所有方法(默认实现为空)
abstract class AbstractAdapter implements Target {
    @Override
    public void method1() {
        // 默认实现为空
    }

    @Override
    public void method2() {
        // 默认实现为空
    }

    @Override
    public void method3() {
        // 默认实现为空
    }
}

// 实现类只需要关注自己感兴趣的方法
class ConcreteAdapter extends AbstractAdapter {
    @Override
    public void method2() {
        System.out.println("ConcreteAdapter: Only implementing method2.");
    }
}

// 测试
public class Main {
    public static void main(String[] args) {
        Target adapter = new ConcreteAdapter();
        adapter.method2(); // 只执行感兴趣的方法
    }
}