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. 接口不兼容但功能相似的类之间,适配器可以帮助它们协同工作。
相关推荐
TheITSea7 分钟前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
AuroraI'ncoding14 分钟前
SpringMVC接收请求参数
java
九圣残炎39 分钟前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
天天扭码1 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
程序猿小柒1 小时前
leetcode hot100【LeetCode 4.寻找两个正序数组的中位数】java实现
java·算法·leetcode
不爱学习的YY酱2 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
丁总学Java2 小时前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂2 小时前
Java 代理模式详解
java·开发语言·代理模式
duration~2 小时前
SpringAOP模拟实现
java·开发语言
小码ssim2 小时前
IDEA使用tips(LTS✍)
java·ide·intellij-idea