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. 接口不兼容但功能相似的类之间,适配器可以帮助它们协同工作。
相关推荐
等一场春雨16 分钟前
Java设计模式 八 适配器模式 (Adapter Pattern)
java·设计模式·适配器模式
一弓虽37 分钟前
java基础学习——jdbc基础知识详细介绍
java·学习·jdbc·连接池
王磊鑫38 分钟前
Java入门笔记(1)
java·开发语言·笔记
硬件人某某某1 小时前
Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
java·开发语言·社区团购小程序·团购小程序·java社区团购小程序
程序员徐师兄1 小时前
Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
java·spring boot·微信小程序·校园外卖点餐·外卖点餐小程序·校园外卖点餐小程序
chengpei1471 小时前
chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确
java·前端·chrome·spring boot·json
五味香1 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
Joeysoda1 小时前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
扫地僧0092 小时前
(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
java·开发语言
天乐敲代码2 小时前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法