Java设计模式——适配器模式

适配器模式 (Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换成客户端希望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作。适配器模式的主要目的是兼容性和重用性,特别是在使用一些已有的类,而它们的接口又不符合要求时。

适配器模式的核心思想

适配器模式的核心是将一个类的接口转换为客户端期望的另一个接口,从而实现类之间的兼容。它就像是一个"适配器插头",可以让本来不兼容的接口顺利对接。

适配器模式的两种类型

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

  2. 对象适配器模式(使用组合实现)

1. 类适配器模式

类适配器模式使用继承的方式来实现适配器。它通过继承一个已有的类,并实现目标接口,使得适配器可以"表现"成目标接口的类型。

优点:可以实现多个适配器之间的灵活转换。通过继承,可以直接访问被适配类的方法。

缺点:适配器类需要继承已有类,这限制了适配器类的灵活性,因为 Java 等语言中不支持多重继承,所以一个适配器类最多只能适配一个类。适配器与被适配类之间的耦合度较高。

示例 : 假设有一个VGA接口,但现在需要一个HDMI接口来连接显示器,可以创建一个VGAAdapter类来继承VGA接口,并实现HDMI接口。

java 复制代码
// HDMI接口
interface HDMI {
    void connectWithHDMI();
}

// VGA类
class VGA {
    void connectWithVGA() {
        System.out.println("使用VGA链接");
    }
}

// VGA到HDMI的适配器
class VGAAdapter extends VGA implements HDMI {
    @Override
    public void connectWithHDMI() {
        connectWithVGA(); // 调用VGA的方法实现HDMI的功能
        System.out.println("调用HDMI");
    }
}
2. 对象适配器模式

对象适配器模式使用组合 的方式,将已有类的实例作为适配器的一个成员变量,通过调用这个实例的方法来完成适配。对象适配器模式更常用,因为它更加灵活,可以动态组合不同的适配器对象。

  • 优点

    • 适配器与被适配类之间的耦合度较低,可以适配多个不同的类。
    • 可以实现多个类的适配,只要这些类实现了适配器中的方法。
  • 缺点

    • 需要在适配器中维护被适配对象的实例,会稍微增加复杂性。

示例: 以同样的VGA和HDMI接口为例,我们可以使用对象适配器模式来实现适配器。

java 复制代码
// HDMI接口
interface HDMI {
    void connectWithHDMI();
}

// VGA类
class VGA {
    void connectWithVGA() {
        System.out.println("使用VGA");
    }
}

// VGA到HDMI的适配器(使用组合)
class VGAAdapter implements HDMI {
    private VGA vga;

    VGAAdapter(VGA vga) {
        this.vga = vga;
    }

    @Override
    public void connectWithHDMI() {
        vga.connectWithVGA(); // 使用VGA对象的方法
        System.out.println("采用HDMI");
    }
}

适配器模式的应用场景

适配器模式非常适合在以下场景中使用:

  1. 希望复用一些现有的类,但这些类的接口不符合你的需求时。
  2. 需要将多个不兼容的接口集成到一个接口中时,可以使用适配器来封装。
  3. 使用第三方库时,库的接口不能直接满足系统的需求,可以创建一个适配器来连接现有系统与第三方库。
  4. 接口不兼容但功能相似的类之间,适配器可以帮助它们协同工作。
相关推荐
majingming1237 小时前
FUNCTION
java·前端·javascript
zopple7 小时前
常见的 Spring 项目目录结构
java·后端·spring
xuxie999 小时前
N11 ARM-irq
java·开发语言
cjy0001119 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20179 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin012210 小时前
Spring Boot实现定时任务
java
小江的记录本10 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341610 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默10 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长10 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate