java设计模式:03-01-适配器模式

适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式通过创建一个中间层(适配器)来实现不同接口之间的兼容。

适配器模式的应用场景

  • 系统需要使用现有的类,但这些类的接口不符合需求:例如,当新系统需要使用旧系统的接口。
  • 需要将一个类的接口转换成客户希望的另一个接口:例如,第三方库的接口与现有系统的接口不兼容时。
  • 希望重用一些现有的类,但接口不兼容:例如,在遗留系统与新系统之间做数据转换时。

适配器模式的实现方式

1. 类适配器模式(使用继承实现)

思想:通过继承适配者类(Adaptee),将适配者类的方法适配到目标接口(Target Interface)的方法上。

实现方式:

java 复制代码
// 目标接口
interface Target {
    void request();
}

// 适配者类
class Adaptee {
    public void specificRequest() {
        System.out.println("Called specificRequest()");
    }
}

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

// 客户端代码
public class ClassAdapterPattern {
    public static void main(String[] args) {
        Target target = new ClassAdapter();
        target.request();
    }
}

优点:

  • 适配器类通过继承适配者类,不需要显式创建适配者类的实例。
  • 适配器类可以重写适配者类的方法,提供更灵活的实现。

缺点:

  • Java 不支持多继承,如果适配者类已经有一个父类,无法再继承适配者类。
  • 适配器类紧耦合于适配者类,难以复用和扩展。
2. 对象适配器模式(使用组合实现)

思想:通过组合适配者类的实例,将适配者类的方法适配到目标接口的方法上。

实现方式:

java 复制代码
// 目标接口
interface Target {
    void request();
}

// 适配者类
class Adaptee {
    public void specificRequest() {
        System.out.println("Called specificRequest()");
    }
}

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

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

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

// 客户端代码
public class ObjectAdapterPattern {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}

优点:

  • 适配器类与适配者类是松散耦合的,适配器类不继承适配者类,可以复用多个不同的适配者类。
  • 可以更灵活地扩展和复用代码。

缺点:

  • 需要显式创建适配者类的实例,增加了系统的复杂度。
  • 适配器类需要与适配者类保持一致,增加了适配器类的复杂度。

总结

实现方式 优点 缺点
类适配器模式 适配器类通过继承适配者类,不需要显式创建适配者类的实例。 不支持多继承,适配器类紧耦合于适配者类,难以复用和扩展。
对象适配器模式 适配器类与适配者类是松散耦合的,可以复用多个不同的适配者类。 需要显式创建适配者类的实例,增加了系统的复杂度。

选择哪种实现方式应根据具体的需求和系统的复杂度来决定。如果适配者类的接口较为简单且不需要多继承,类适配器模式较为合适。如果需要复用多个不同的适配者类或适配者类的接口复杂,使用对象适配器模式更加灵活和可扩展。

相关推荐
xfan_me3 分钟前
维修保养记录精准版 API 对接实战指南
java·大数据·python
Keven-zhou5 分钟前
不用先学前端框架,Java后端也能独立交付项目?飞算JavaAI实测
java
海上小飞龙7 分钟前
改一个数,右边全得重算,这题怎么扛住两万次查询
java·c++·python
Leo.yuan7 分钟前
从“看全局“到“评成效“:央国企穿透式监管六步链路,哪些厂商能真正闭环
java·大数据·人工智能
小马哥程序开发25 分钟前
[点赞收藏免费领取 · 项目源码]57105基于Spring Boot的充电桩管理系统的设计与实现
java·spring boot·源码·课程设计·毕设·大作业·课设
九皇叔叔1 小时前
【09】SpringBoot4 MyBatisPlus 增删改查(CRUD)
java·mybatis·mybatisplus
白杨尚青1 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
anew___2 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
天天向上2912 小时前
Spring AI 实战:14 个踩坑记录,其中一个让我的测试全绿但产品是坏的
java·开源
正在走向自律2 小时前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十