【JAVA设计模式】适配器模式——类适配器模式详解与案例分析
前言
在软件设计中,适配器模式(Adapter Pattern)是一种结构型设计模式,旨在使不兼容的接口能够协同工作。它通过引入一个适配器类,帮助两个接口之间进行适配,使得它们能够互相操作。本文将详细介绍适配器模式的定义、使用场景、实现方式、接口适配器以及其优缺点。
一、适配器模式的定义
适配器模式通过引入一个适配器类,将一个类的接口转换成客户端所期望的另一种接口。适配器模式的核心在于“适配”,它允许原本由于接口不兼容而无法一起工作的类能够协同工作。
主要角色
- 目标接口(Target):目标接口是客户端所期望的接口,定义了客户端需要的方法。客户端代码依赖于目标接口而不是具体的实现类,这样可以使系统更加灵活和可扩展。
- 适配者类(Adaptee):源接口是现有的接口,它的接口与目标接口不一致。源接口包含了客户端需要的实际功能,但其接口形式无法直接被客户端使用。
- 适配器类(Adapter):适配器实现目标接口,并持有源接口的实例(对象适配器)或继承源接口(类适配器)。适配器通过在实现目标接口的方法中调用源接口的方法,将源接口的方法转换成目标接口的方法。
三者之间的关系
- 客户端依赖目标接口进行编程。
- 适配器实现了目标接口,并通过组合或继承的方式调用源接口的方法。
- 适配器将源接口的方法适配成目标接口的方法,从而使得客户端可以无缝地使用源接口的功能。
二、适配器模式的使用场景
适配器模式适用于以下情况:
- 系统需要使用现有的类,但接口不符合要求:如果你有一个类,它的接口与系统的需求不匹配,可以通过适配器模式进行转换。
- 需要使用多个现有的类,但接口不一致:如果系统中需要整合多个不兼容的接口,可以通过适配器模式使其兼容。
- 系统中使用第三方库或框架:当你引入第三方库或框架时,可能会遇到接口不一致的情况,适配器模式可以帮助解决这些问题。
三、适配器模式的实现方式
适配器模式有三种主要的实现方式:类适配器,对象适配器和接口适配器
本文讲解的是类适配器
类适配器
特点
-
使用继承:类适配器通过继承源类来实现适配功能。
-
单一适配:由于 Java 中不支持多重继承,类适配器只能适配一个源类。
优缺点
优点
- 简单实现:
- 由于类适配器通过继承实现,它可以直接访问被适配类(Adaptee)的所有方法。这使得实现适配器时相对简单,不需要额外的委托逻辑。
- 提高代码的可复用性:
- 适配器模式通过继承实现,使得子类能够继承父类的所有功能,从而提高了代码的复用性。
- 可以重定义被适配类的一些行为:
- 通过继承,可以在适配器类中重定义被适配类的一些方法,实现更加灵活的适配。
缺点
- 受限于单继承:
- 类适配器模式在Java等单继承语言中有一个显著的缺点,即一个类只能继承一个父类。这意味着如果适配器类已经有一个父类,就不能再使用类适配器模式来继承另一个类。
- 高耦合:
- 适配器类和被适配类之间的耦合度较高,因为适配器类直接继承了被适配类的实现。如果被适配类发生变化,适配器类可能也需要进行相应的修改。
- 不符合“组合优于继承”原则:
- 面向对象设计中,组合优于继承的原则提倡使用组合来代替继承,以降低类之间的耦合度。类适配器模式违背了这一原则,因为它是通过继承来实现适配的。
【例】读卡器
现有一台电脑只能读取SD卡,而要读取TE卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将IE卡中的内容读取出来。
类图如下:

其中:

为适配者类
定义了一个接口 TFCard 接口,有两个方法(读取数据,写数据)。子实现类TFCardImpl重写了接口的两个方法

这一部分为目标接口,主要是SDCard(包含两个方法:读数据,写数据),子实现类为SDcardImpl

Computer只能使用SD卡,所以方法名为readSD(),需要SDcard类型的对象,返回字符串
当我们想用Computer去读取TF卡中的内容,不能直接读取,需要定义适配器类:

我们要让这个适配器类实现目标接口,就要重写SDCard中的两个方法,同时我们要让它去继承TFCardImpl
实现之后这两个方法看似是从SD卡中读数据写数据,但是实际上用的是TF卡中的功能
代码实现:
//客户端
public class Client {public static void main(String[] args) {//创建计算机对象Computer computer = new Computer();//读取SD卡中的数据String msg = computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println("==============================");//使用该电脑读取TF卡中的数据//定义适配器类String msg1 = computer.readSD(new SDAdapterTF());System.out.println(msg1);}
}
//计算机类
public class Computer {//从SD卡中读取数据public String readSD(SDCard sdCard) {if (sdCard == null) {throw new NullPointerException("sd card is null");}return sdCard.readSD();}
}
//适配器类
public class SDAdapterTF extends TFCardImpl implements SDCard {@Overridepublic String readSD() {System.out.println("adapter read tf card");return readTF();}@Overridepublic void writeSD(String msg) {System.out.println("adapter wrete tf card");writeTF(msg);}
}
public interface SDCard {//从SD卡中读取数据String readSD();//往SD卡中写数据void writeSD(String msg);
}
//具体的SD卡
public class SDCardImpl implements SDCard{@Overridepublic String readSD() {String msg = "SDCard read msg : SD";return msg;}@Overridepublic void writeSD(String msg) {System.out.println("SDCard write msg : " + msg);}
}
//适配者类的接口
public interface TFCard {//从TF卡中读取数据String readTF();//往TF卡中写数据void writeTF(String msg);}
//适配者类
public class TFCardImpl implements TFCard{@Overridepublic String readTF() {String msg = "TFCard read msg : TF";return msg;}@Overridepublic void writeTF(String msg) {System.out.println("TFCard write msg : " + msg);}
}
四、总结
适配器模式是一种强大的设计模式,能够有效解决接口不兼容的问题,使得不同接口的类能够协同工作。通过合理使用适配器模式,可以提高系统的灵活性和复用性,但也需要注意其可能带来的复杂性和性能影响。
希望本文对你理解适配器模式有所帮助。如果你有任何问题或建议,欢迎在评论区留言!
参考资料:12.设计模式-结构型模式-类适配器模式案例实现_哔哩哔哩_bilibili
已经到底啦!!
相关文章:
【JAVA设计模式】适配器模式——类适配器模式详解与案例分析
前言 在软件设计中,适配器模式(Adapter Pattern)是一种结构型设计模式,旨在使不兼容的接口能够协同工作。它通过引入一个适配器类,帮助两个接口之间进行适配,使得它们能够互相操作。本文将详细介绍适配器模…...
【Vue】全局组件和局部组件
一、全局组件 定义: 全局组件是在整个Vue应用中都可以使用的组件。它们被注册在Vue的根实例上,因此可以在任何子组件的模板中被引用,而无需在每个组件中重复注册。 注册方式: 全局组件通过Vue.component方法进行注册。这个方法接…...
react引入高德地图并初始化卫星地图
react引入高德地图并初始化卫星地图 1.安装依赖 yarn add react-amap amap/amap-jsapi-loader2.初始化地图 import AMapLoader from "amap/amap-jsapi-loader"; import { FC, useEffect, useRef, useState } from "react";const HomeRight () > {con…...
2024最简七步完成 将本地项目提交到github仓库方法
2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并(1)初始化本地仓库(2)本地仓库与Github仓库关联&…...
前端WebSocket入门,看这篇就够啦!!
在HTML5 的早期开发过程中,由于意识到现有的 HTTP 协议在实时通信方面的不足,开发者开始探索能够在 Web 环境下实现双向实时通信的新的通信协议,提出了 WebSocket 协议的概念。 一、什么是 WebSocket? WebSocket 是一种在单个 T…...
漏洞复现-F6-11泛微-E-Cology-SQL
本文来自无问社区,更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤࿰…...
Turbo Boost 禁用
最近在做OAI NR的时候关闭CPU 睿频的时候出了一些问题,这里我把我找到的资料记录一下: 禁用 Turbo Boost 的过程可能会因不同的 BIOS/UEFI 和操作系统设置而有所不同。以下是一些可能的原因及解决方法: 可能的原因 BIOS/UEFI 设置问题: 你的…...
假期BUUCTF小练习3
文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…...
【ubuntu系统】在虚拟机内安装Ubuntu
Ubuntu系统装机 描述新装机后的常规配置, 虚拟机使用vbox terminal 打不开 CTRL ALT F3 进入命令行模式(需要返回桌面时CTRL ALT F1)root用户登入cd /etc/default vi locale LANG“en_US” 改成 LANG“en_US.UTF-8”保存修改后&…...
Python初学者必须掌握的基础知识点
Python初学者必须掌握的基础知识点包括数据类型与变量、控制结构(条件语句和循环语句)、基本数据结构(列表、元组、字典、集合)、函数与模块、以及字符串处理等。以下是对这些基础知识点及其对应代码的详细介绍: 1. …...
ESP32是什么?
ESP32是一款由乐鑫信息科技(Espressif Systems)推出的高度集成的低功耗系统级芯片(SoC),它结合了双核处理器、无线通信、低功耗特性和丰富的外设,特别适用于各种物联网(IoT)应用。以…...
jemalloc分析内存
分析内存泄漏过程中, 由于tcmalloc不能长时间开启heap profile(会不停涨内存,导致内存爆掉).尝试换jemalloc. 交叉编译: git clone https://github.com/jemalloc/jemalloc.git./autogen.sh./configure --hostaarch64-…...
【QT】qss
目录 基本语法 设置全局样式 问题 分离样式代码 方案1 方案2 选择器 概况 子控件选择器 伪类选择器 盒子模型 修改控件样式示例 按钮 属性小结 复选框 属性小结 输入框 属性小结 列表框 属性小结 渐变色 示例: 菜单栏 设置菜单栏的背景…...
Java处理大数据的技巧
大数据处理是现代计算机科学中的一个重要领域,通过高效的算法和工具,我们可以从大量数据中提取有价值的信息。本文将介绍一些处理大数据的技巧和策略,并讨论如何通过Java与MySQL实现高效的大数据处理。 一、什么是大数据处理? 大…...
JavaScript基础——JavaScript常见语句(判断语句、循环语句、控制流语句)
JavaScript提供了丰富的语句来控制程序的执行流程,包括用于条件判断的if、switch和三元运算符,以及用于循环的for、while、do...while、for...in和for...of。此外,还有控制流语句如break、continue和return。 判断语句 if 语句 if 语句&…...
材质球向shader传值失败
unity中导入spine模型,当模型挂载SkeletonMecanim组件后,发现材质球向shader传值失败,改为SetPropertyBlock后可行。 //spine模型使用材质球传参数,当spine模型上挂载有SkeletonMecanim的情况下,会传值失败!!!!// for…...
【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!
星环科技大数据基础平台TDH社区版,在保留了商业版核心技术优势的基础上最大程度地降低了用户使用大数据技术的门槛与成本,具有更轻量、更简单、更易用等特性。 此次TDH社区开发版、社区版、社区订阅版均发布了新版本,带来新的产品组件和新的…...
【反序列化漏洞】serial靶机详解
一、安装靶机 首先创建新的虚拟机。 然后选择客户机版本为Ubuntu 64位。 然后选择使用现有磁盘,选择下载的vmdk磁盘文件即可。剩下的都是默认 二、信息收集 发现主机192.168.204.143 访问 扫描端口nmap -A 192.168.204.143 -p-,发现只有ssh:22和http:8…...
C#列表按照日期进行从大到小排序
C#列表按照日期进行从大到小排序...
rt-thread每个线程状态切换方法
线程状态 RT-Thread 中线程的状态定义在 rt_thread.h 头文件中,通常包括以下几种状态: RT_THREAD_INIT:线程初始化状态。RT_THREAD_READY:线程就绪状态。RT_THREAD_SUSPEND:线程挂起状态。RT_THREAD_RUNNING…...
5大核心功能提升英雄联盟体验:League-Toolkit全场景应用指南
5大核心功能提升英雄联盟体验:League-Toolkit全场景应用指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-T…...
LiuJuan20260223Zimage v1.0作品集:当传统工笔画遇见AI生成
LiuJuan20260223Zimage v1.0作品集:当传统工笔画遇见AI生成 1. 引言:一次跨越时空的艺术对话 想象一下,你拍了一张现代都市的夜景,或者设计了一张充满未来感的数字海报,然后,你把它交给一位深谙宋元笔法的…...
3步搞定Windows 11优化:用Win11Debloat让你的电脑更快更干净
3步搞定Windows 11优化:用Win11Debloat让你的电脑更快更干净 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简…...
Windows Insider离线管理完全指南:无账户切换方法与命令行操作技巧
Windows Insider离线管理完全指南:无账户切换方法与命令行操作技巧 【免费下载链接】offlineinsiderenroll 项目地址: https://gitcode.com/gh_mirrors/of/offlineinsiderenroll 在Windows系统管理中,用户常常面临需要在不同更新通道间切换的需求…...
收藏!国内大厂大模型人才招聘真相,小白/程序员入门必看
在大模型技术飞速迭代的当下,国内各大互联网大厂对大模型高端人才的投入力度已然拉满,几乎每家头部企业都推出了针对顶尖人才的专项招聘计划,而这些计划的核心共性,就是“高薪兜底”搭配“高门槛筛选”,成为行业内最引…...
一、硬件接线与配置
自动配料控制系统 S7-200SMART 与组态王6.55联机程序 COM3串口通讯 带运行效果视频 IO表 和 PLC接线图CAD 老规矩先看IO表——配料系统核心是4路称重传感器2台变频器控制下料速度。PLC的EM AE04模块接0-10V称重信号,EM DR32数字量模块控制接触器和报警灯。CAD接线图…...
Onekey核心价值解析:5个维度带你重新认识Steam游戏清单获取
Onekey核心价值解析:5个维度带你重新认识Steam游戏清单获取 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey是一款开源的Steam Depot清单下载器,通过智能化的数据获…...
大数据核心知识全解(零基础到Hadoop专家路线)【20260324】001篇
文章目录 大数据核心知识全解(零基础到Hadoop专家路线) 一、为什么会出现大数据?(本质原因) 1. 数据来源爆炸 2. 传统技术扛不住 3. 需求倒逼 二、CNCF 是什么?(云原生核心组织) 它和大数据的关系 三、为什么 Hadoop 会流行?(3个核心原因) 1. 它解决了当时最痛的问题…...
复杂网络演化博弈代码:从nw小世界网络到互动创新社区知识共享研究
复杂网络演化博弈代码 nw小世界网络 复现文章 基于网络演化博弈的互动创新社区用户 知识共享行为影响因素研究 An evolutionary analysis on the effect of government policies on electric vehicle diffusion in complex network ()最近在研究一些关于复杂网络演化博弈的有趣…...
DanKoe 视频笔记:生产力提升:专注工作的力量 [特殊字符]
在本节课中,我们将要学习如何通过每天仅 4 小时的专注工作,来显著改变你的生活轨迹。我们将探讨注意力的价值、识别高回报机会的方法,并掌握一套进入并保持深度专注状态的实用技巧。 能够有意识地引导你的注意力,不仅能节省时间&a…...
