JAVA编程【设计模式之适配器模式】

发布于:2025-03-07 ⋅ 阅读:(26) ⋅ 点赞:(0)

Java 设计模式之适配器模式教程

1. 适配器模式简介

1.1 什么是适配器模式?

适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的接口,使原本因接口不匹配而无法一起工作的类能够协同工作。

1.2 适用场景

复用现有类,但接口不兼容
使用第三方库,但方法不匹配
统一多个类的接口

2. 适配器模式的三种实现方式

适配器模式有三种常见实现方式:

类适配器模式(基于继承)
对象适配器模式(基于组合)
接口适配器模式(基于抽象类)

3. 类适配器模式

3.1 结构

Target(目标接口):客户端期望使用的接口
Adaptee(被适配者):已有的不兼容接口
Adapter(适配器):继承 Adaptee 并实现 Target,进行接口转换

3.2 UML 图

       ┌───────────┐
       │   Target  │  (目标接口)
       └───────────┘
             ▲
             │
       ┌───────────┐
       │  Adapter  │  (适配器)
       └───────────┘
             ▲
             │
       ┌───────────┐
       │  Adaptee  │  (被适配者)
       └───────────┘

3.3 代码示例

// 1. 目标接口(客户端期望的接口)
interface Target {
    void request();
}

// 2. 被适配者(已有类,接口不兼容)
class Adaptee {
    void specificRequest() {
        System.out.println("被适配者的方法调用");
    }
}

// 3. 适配器(继承 Adaptee 并实现 Target)
class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest(); // 适配器将 request() 映射到 specificRequest()
    }
}

// 4. 客户端
public class ClassAdapterDemo {
    public static void main(String[] args) {
        Target target = new Adapter(); // 使用适配器
        target.request(); // 输出:被适配者的方法调用
    }
}

3.4 适用场景

✅ 适用于:适配器和被适配者是同一类层级,因为适配器需要继承被适配者。
❌ 缺点:无法适配多个类,因为 Java 不支持多继承。

4. 对象适配器模式

4.1 结构

对象适配器模式采用 组合(而不是继承),适配器持有 Adaptee 的实例,从而调用其方法。

4.2 UML 图

       ┌───────────┐
       │   Target  │  (目标接口)
       └───────────┘
             ▲
             │
       ┌───────────┐
       │  Adapter  │  (适配器)
       └───────────┘
             │
     ┌──────┴──────┐
     │  Adaptee    │  (被适配者)
     └─────────────┘

4.3 代码示例

// 1. 目标接口(客户端期望的接口)
interface Target {
    void request();
}

// 2. 被适配者(已有类,接口不兼容)
class Adaptee {
    void specificRequest() {
        System.out.println("被适配者的方法调用");
    }
}

// 3. 适配器(对象适配器,使用组合方式)
class ObjectAdapter implements Target {
    private final Adaptee adaptee;

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

    @Override
    public void request() {
        adaptee.specificRequest(); // 委托给被适配者的方法
    }
}

// 4. 客户端
public class ObjectAdapterDemo {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee); // 适配器
        target.request(); // 输出:被适配者的方法调用
    }
}

4.4 适用场景

✅ 适用于:希望适配多个不同的类(组合可以支持多个 Adaptee)。
✅ 优点:不需要修改 Adaptee 代码,更符合开闭原则。
❌ 缺点:比类适配器稍复杂,需要额外创建适配器实例。

5. 接口适配器模式

5.1 结构

接口适配器模式适用于接口有多个方法,但子类只需实现部分方法。通过抽象类提供默认实现,子类只需覆盖需要的方法。

5.2 代码示例

// 1. 目标接口(含多个方法)
interface MultiTarget {
    void methodA();
    void methodB();
    void methodC();
}

// 2. 抽象适配器(提供默认实现)
abstract class AbstractAdapter implements MultiTarget {
    @Override
    public void methodA() {}

    @Override
    public void methodB() {}

    @Override
    public void methodC() {}
}

// 3. 具体适配器(只实现 methodA)
class ConcreteAdapter extends AbstractAdapter {
    @Override
    public void methodA() {
        System.out.println("实现 methodA");
    }
}

// 4. 客户端
public class InterfaceAdapterDemo {
    public static void main(String[] args) {
        MultiTarget target = new ConcreteAdapter();
        target.methodA(); // 输出:实现 methodA
    }
}

5.3 适用场景

✅ 适用于:接口有多个方法,但子类只需实现部分。
✅ 优点:避免子类必须实现所有方法,提高灵活性。
❌ 缺点:适用于接口较大的场景,如果接口方法较少,直接实现即可。

6. 适配器模式总结

在这里插入图片描述

7. 总结

适配器模式是 Java 设计模式中最常见的模式之一,主要用于接口不兼容的情况。在不同场景下,选择合适的适配器模式可以提高代码复用性,减少修改成本,符合开闭原则。