Java 设计模式:适配器模式详解

Java 设计模式:适配器模式详解

适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个类的接口转换为客户端期望的另一个接口,使原本不兼容的类能够协同工作。适配器模式就像现实生活中的电源适配器,解决接口不匹配的问题。本文将介绍适配器模式的定义、实现方式及其在 Java 中的应用。

1. 什么是适配器模式?

适配器模式的核心思想是:通过引入一个适配器类,将现有系统的接口(被适配者)转换为目标接口,使客户端可以无缝使用不兼容的类。它常用于系统集成或接口转换场景。

模式结构

  • 目标接口(Target):客户端期望使用的接口。
  • 被适配者(Adaptee):需要适配的现有类,拥有不兼容的接口。
  • 适配器(Adapter):实现目标接口,内部调用被适配者的方法。
  • 客户端(Client):使用目标接口调用适配器。

适配器类型

  1. 类适配器:通过继承实现(Java 中少用,因单继承限制)。
  2. 对象适配器:通过组合实现(更灵活,推荐使用)。

2. 适配器模式的实现方式

以下是一个示例:将一个旧的日志记录系统(基于文件)适配到新系统(基于数据库)要求的接口。

2.1 定义目标接口

public interface Logger {void log(String message); // 新系统的日志接口
}

2.2 定义被适配者

public class FileLogger {public void writeToFile(String message) {System.out.println("写入文件日志: " + message);}
}

2.3 实现对象适配器

public class FileLoggerAdapter implements Logger {private FileLogger fileLogger;public FileLoggerAdapter(FileLogger fileLogger) {this.fileLogger = fileLogger;}@Overridepublic void log(String message) {fileLogger.writeToFile(message); // 适配旧接口}
}

2.4 实现类适配器(可选)

public class FileLoggerClassAdapter extends FileLogger implements Logger {@Overridepublic void log(String message) {writeToFile(message); // 直接调用父类方法}
}

注意:类适配器需要继承 FileLogger,在 Java 中由于单继承限制,对象适配器更常用。

2.5 客户端使用

public class Client {public static void main(String[] args) {// 使用对象适配器FileLogger fileLogger = new FileLogger();Logger logger = new FileLoggerAdapter(fileLogger);logger.log("这是一条测试日志");// 使用类适配器(可选)Logger classLogger = new FileLoggerClassAdapter();classLogger.log("这是一条类适配器日志");}
}

输出结果

写入文件日志: 这是一条测试日志
写入文件日志: 这是一条类适配器日志

3. 使用默认适配器模式(扩展)

默认适配器模式是一种变体,适用于接口方法较多但客户端只需实现部分方法的场景。通过提供一个抽象类实现接口的默认行为,简化子类的工作。

示例:默认适配器

public interface AdvancedLogger {void logInfo(String message);void logError(String message);void logDebug(String message);
}public abstract class DefaultLoggerAdapter implements AdvancedLogger {@Overridepublic void logInfo(String message) {// 默认空实现}@Overridepublic void logError(String message) {// 默认空实现}@Overridepublic void logDebug(String message) {// 默认空实现}
}public class SimpleLogger extends DefaultLoggerAdapter {@Overridepublic void logInfo(String message) {System.out.println("INFO: " + message);}
}

使用

SimpleLogger logger = new SimpleLogger();
logger.logInfo("仅记录信息日志");

4. 适配器模式的优缺点

优点

  1. 接口转换:使不兼容的接口能够协同工作。
  2. 复用现有类:无需修改原有代码即可集成旧系统。
  3. 灵活性高:对象适配器通过组合支持动态替换被适配者。

缺点

  1. 复杂性增加:引入适配器类可能使系统结构更复杂。
  2. 适配成本:大量接口转换可能导致维护困难。

5. 实际应用场景

  • 第三方库集成:适配第三方库的接口以符合系统要求。
  • 遗留系统迁移:将旧系统功能适配到新框架。
  • 事件监听器:Java AWT/Swing 中的 Adapter 类(如 MouseAdapter)。

示例:Java 中的 MouseAdapter

frame.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("鼠标点击");}
});

MouseAdapter 是一个默认适配器,提供了 MouseListener 接口的空实现,客户端只需覆盖所需方法。


6. 与其他模式的区别

  • 装饰者模式:增强对象功能,保持接口一致;适配器模式转换接口。
  • 桥接模式:分离抽象和实现,强调长期扩展;适配器模式关注接口兼容。

7. 总结

适配器模式是一种解决接口不兼容问题的优雅方案,通过对象适配器或类适配器,将现有功能无缝接入新系统。在 Java 中,对象适配器因其灵活性更为常见,而默认适配器则简化了复杂接口的实现。掌握适配器模式,能有效提升系统集成能力和代码复用性。

希望这篇博文能帮助你理解适配器模式的精髓!如果有其他设计模式相关问题,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]

1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…

Git 学习笔记

这篇笔记记录了我在git学习中常常用到的指令&#xff0c;方便在未来进行查阅。此篇文章也会根据笔者的学习进度持续更新。 网站分享 Git 常用命令大全 Learn Git Branching 基础 $ git init //在当前位置配置一个git版本库 $ git add <file> //将文件添加至…

Dynamics365 ExportPdfTemplateExportWordTemplate两个Action调用的body构造

这两天在用ExportPdfTemplate做pdf导出功能时&#xff0c;遇到了如下问题InnerException : Microsoft.OData.ODataException: An unexpected StartArray node was found when reading from the JSON reader. A PrimitiveValue node was expected. 我的场景是使用power automate…

经典算法 判断一个图是不是树

判断一个图是不是树 问题描述 给一个以0 0结尾的整数对列表&#xff0c;除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图是不是树。是输出YES&#xff0c;不是输出NO。 输入样例1 6 8 5 3 5 2 6 4 5…

【嵌入式八股2】C++:STL容器与算法

1. STL常见容器及其内部实现的数据结构 序号 名称 描述 存储结构 常用方法和操作 1vector动态分配的数组顺序数组&#xff08;array&#xff09;v.push_back(), v.pop_back(), v.insert(), v.erase(), v.capacity(), v.size(), v.at(idx), v.front(), v.back()2list双向链表离…

vmcore分析锁问题实例(x86-64)

问题描述&#xff1a;系统出现panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

leetcode03 -- 武汉旅游查询系统

武汉旅游查询系统 1 界面展示 1.首页地图界面 2.查找功能 在查找框内输入查找的景点名称 查找到的景点在地图上进行定位,右侧展示景点的详细信息。 3.添加景点功能 在地图上点击某个位置,系统弹出一个输入框供用户填写景点的名称和描述。 在弹出的输入框中输入景点名…

玩机进阶教程----MTK芯片设备刷机导致的死砖修复实例解析 连电脑毫无反应 非硬件问题

在高通芯片机型中,我们可以通过短接主板测试点来激活高通芯片特有的9008底层端口来刷写救砖固件。但通常MTK芯片类的设备联机电脑即可触发深刷模式。但有些例外的情况会导致链接电脑毫无反应。遇到类似故障的友友可以参阅此博文尝试解决。 通过博文了解 1💝💝💝-----实…

09-设计模式企业场景 面试题-mk

文章目录 1.工厂(方法)模式1.1.简单工厂模式(不是设计模式,是编程习惯)1.2.工厂方法模式(企业开发中最常见)1.3.抽象工厂模式2.策略模式2.1.登录案例(工厂模式+策略模式)3.责任链设计模式4.单点登录怎么是实现的?5.权限认证是如何实现的6.上传数据的安全性你们怎么控…

BUUCTF-Web(1-20)

目录 一.SQL注入 (1)[极客大挑战 2019]EasySQL 万能密码 (7)[SUCTF 2019]EasySQL 堆叠注入 解一&#xff1a; 解二&#xff1a; (10)[强网杯 2019]随便注 堆叠注入 解一&#xff1a; 解二&#xff1a; 解三&#xff1a; (8)[极客大挑战 2019]LoveSQL 联…

软件包安装管理Gitlab

官方提供了非常详尽的系统及自动化脚本安装教程 Gitlab官网下载地址&#xff1a;https://gitlab.cn/install/ 1、安装配置 今天我们说一下包安装管理&#xff0c;这样方便我们自己更精确的制定符合我们自己需要的Gitlab仓库 配置&#xff1a;ubuntu2004(focal) 4C8G 下载程…

hadoop执行sqoop任务找不到jar

sqoop:1.4.7 hadoop:3.4.1 数据:oracel-hdfs 2025-04-15 16:57:00,850 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 2025-04-15 16:57:00,901 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 2025-04-15 …

空地机器人在复杂动态环境下,如何高效自主导航?

随着空陆两栖机器人(AGR)在应急救援和城市巡检等领域的应用范围不断扩大&#xff0c;其在复杂动态环境中实现自主导航的挑战也日益凸显。对此香港大学王俊铭基于阿木实验室P600无人机平台自主搭建了一整套空地两栖机器人&#xff0c;使用Prometheus开源框架完成算法的仿真验证与…

MCP调用示例-GitHub仓库操作

在上一篇文章MCP核心概念和应用 ———AI 大模型的标准化工具箱里&#xff0c;我们讲述了MCP的安装&#xff0c;现在让我们试一试通过示例了解它的功能吧&#xff01; 首先确保你已经有了相应的APIKEY。 &#x1f4a1;大模型中转API推荐 ✨中转使用教程 1、点击界面上的 「Done…

zk源码—5.请求的处理过程一

大纲 1.服务器的请求处理链 (1)Leader服务器的请求处理链 一.PrepRequestProcessor请求预处理器 二.ProposalRequestProcessor事务投票处理器 三.SyncRequestProcessor事务日志处理器 四.AckRequestProcessor投票反馈处理器 五.CommitProcessor事务提交处理器 六.ToBeA…

小程序获取用户总结(全)

获取方式 目前小程序获取用户一共有3中(自己接触到的),但由于这个API一直在改,所以不确定后期是否有变动,还是要多关注官方公告。 方式一 使用wx.getUserInfo 实例: wxml 文件<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo&quo…

[LeetCode 1871] 跳跃游戏 7(Ⅶ)

题面&#xff1a; 数据范围&#xff1a; 2 ≤ s . l e n g t h ≤ 1 0 5 2 \le s.length \le 10^5 2≤s.length≤105 s [ i ] s[i] s[i] 要么是 ′ 0 ′ 0 ′0′ &#xff0c;要么是 ′ 1 ′ 1 ′1′ s [ 0 ] 0 s[0] 0 s[0]0 1 ≤ m i n J u m p ≤ m a x J u m p <…

【Linux】基础 IO(文件描述符、重定向、缓冲区)

Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么&#xff1f;2.分配规则3.重定向原理4.通过dup2系统调用重…

Apache Doris SelectDB 技术能力全面解析

Apache Doris 是一款开源的 MPP 数据库&#xff0c;以其优异的分析性能著称&#xff0c;被各行各业广泛应用在实时数据分析、湖仓融合分析、日志与可观测性分析、湖仓构建等场景。Apache Doris 目前被 5000 多家中大型的企业深度应用在生产系统中&#xff0c;包含互联网、金融、…