自学内容网 自学内容网

Java设计模式 八 适配器模式 (Adapter Pattern)

适配器模式 (Adapter Pattern)

适配器模式是一种结构型设计模式,其核心思想是将一个类的接口转换为客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作。


1. 适配器模式的组成

  • Target(目标接口): 定义客户端所期望的接口。
  • Adaptee(适配者类): 定义了一个现有的接口,需要适配的类。
  • Adapter(适配器类): 实现目标接口,并将适配者类的功能包装为目标接口的功能。
  • Client(客户端): 调用目标接口中的方法,间接通过适配器类使用适配者类的功能。

2. 适配器模式的分类

1) 类适配器

通过继承实现适配器功能。

  • 优点: 适配器可以重写适配者的方法。
  • 缺点: Java 不支持多继承,如果目标接口和适配者类不属于同一个继承体系,类适配器无法使用。
2) 对象适配器

通过组合实现适配器功能。

  • 优点: 适配器可以适配多个适配者对象,更加灵活。
  • 缺点: 需要额外维护适配者对象的引用。

3. 适配器模式的实现

1) 类适配器实现

示例代码:

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

// 适配者类(已有接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request from Adaptee.");
    }
}

// 类适配器
public class ClassAdapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Target target = new ClassAdapter();
        target.request();  // 输出: Specific request from Adaptee.
    }
}
2) 对象适配器实现

示例代码:

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

// 适配者类(已有接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request from Adaptee.");
    }
}

// 对象适配器
public class ObjectAdapter implements Target {
    private Adaptee adaptee;

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

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();  // 输出: Specific request from Adaptee.
    }
}

4. 适配器模式的优点

  1. 提高类的复用性: 通过适配器,可以使已有的类满足新的需求。
  2. 提高类的灵活性: 目标接口和适配者类可以独立扩展,而不会相互影响。
  3. 解耦: 客户端不需要直接依赖适配者类,与目标接口解耦。

5. 适配器模式的缺点

  1. 类适配器的局限性: 类适配器使用继承方式实现,受到 Java 单继承的限制。
  2. 系统复杂性增加: 引入适配器后,可能会使系统设计增加额外的复杂性。

6. 适配器模式的使用场景

  1. 现有类的接口与目标接口不兼容时:
    比如使用第三方库或遗留系统中的类,但它们的接口不符合当前需求。

  2. 希望复用一些现有的类,而这些类的接口与当前系统不兼容时:
    通过适配器封装现有类的功能,提供兼容的新接口。

  3. 需要将多个类统一到同一个接口时:
    可以使用适配器模式将不同类的接口统一为目标接口。


7. 适配器模式与其他模式的比较

设计模式作用与适配器模式的区别
桥接模式分离抽象部分和实现部分,使两者可以独立变化桥接模式是设计新系统时的结构设计,适配器用于现有系统的改造。
装饰器模式动态添加新功能装饰器模式扩展对象功能,适配器模式主要解决接口不兼容问题。
代理模式控制对某对象的访问代理模式不改变接口,适配器模式会转换接口。

8. Java 中的典型应用

1) java.util.Arrays 中的 asList 方法

将数组适配为 List

String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);
2) java.io.InputStreamReader

InputStream 适配为 Reader

InputStream inputStream = new FileInputStream("file.txt");
Reader reader = new InputStreamReader(inputStream);
3) javax.xml.bind.annotation.adapters.XmlAdapter

适配 XML 数据与 Java 对象的转换。


9. 总结

适配器模式是一种解决接口不兼容问题的有效方法,尤其在代码重用和系统整合时尤为常用。它可以通过类适配器和对象适配器实现,分别基于继承和组合的方式。
在实际开发中,适配器模式广泛应用于系统改造兼容第三方库的场景,可以显著提高代码的复用性和灵活性。


原文地址:https://blog.csdn.net/WithCYwind/article/details/145285532

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!