13.结构型 - 适配器模式 (Adapter Pattern)

news/2025/12/8 22:03:20/文章来源:https://www.cnblogs.com/dddy/p/19323807

适配器模式 (Adapter Pattern)

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁
意图: 将一个类的接口转换成客户希望的另外一个接口; 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
主要解决: 主要解决在软件系统中, 常常要将一些"现存的对象"放到新的环境中, 而新环境要求的接口是现对象不能满足的;

代码实例

例: 一个生活中的例子, 家里有一台空调, 现有一个三口的插座, 空调使用三口插座, 完美匹配;
倘若再买一台TV电视, 使用二口插座, 如何解决这个问题?

UML类图

Pasted image 20231128214112

1.三线 设备及实现

//三口插头
public interface TriplePin {//参数分别为火线live, 零线null, 地线earthpublic void electrify(int l, int n, int e);
}// 空调
public class AirConditioning implements TriplePin {@Overridepublic void electrify(int l, int n, int e) {System.out.println("火线接通: " + l);System.out.println("零线接通: " + n);System.out.println("地线接通: " + e); }
}

2.二线 设备及实现

//二口插头
public interface DualPin {public void electrify(int l, int n);//这里没有地线
}
// 电视
public class TV implements DualPin {@Overridepublic void electrify(int l, int n) {System.out.println("火线接通: " + l);System.out.println("零线接通: " + n);}
}

3.使用者

// 我是一个固执的电源, 只给三线设备的供电
public class Power {@Overridepublic void ConnectElectricity(TriplePin pin) {int l = 1, n = 0, e = -1;pin.electrify( l,  n,  e);}
}

4.适配实现

有两种实现方式

  1. 类适配器: 继承实现
  2. 对象适配器: 组合实现

推荐使用组合的方式优于继承方式

4.1.对象适配器(组合实现)

public class TriplePinAdapter implements TriplePin {private DualPin dualPinDevice; //创建适配器的时候, 需要把双插设备接入进来public TriplePinAdapter(DualPin dualPinDevice) {this.dualPinDevice = dualPinDevice;}//适配器实现 目标接口(三线)@Overridepublic void electrify(int l, int n, int e) {//实际上调用了被适配设备的双插通电, 地线e被丢弃了; dualPinDevice.electrify(l, n);}}

4.2.对象适配器(继承的方式)

//继承二线设备, 实现三线设备接口
public class TriplePinAdapter extends TV implements TriplePin{@Overridepublic void electrify(int l, int n, int e) {super.electrify(l, n);}}

5.测试

 public static void main(String[] args) {Power power = new Power();//固执的电源power.ConnectElectricity(new AirConditioning() );//给空调使用, 完美匹配;// 新买一台电视, 它是二线设备, 也想用, 怎么办?DualPin tv = new TV();// 通过适配器, 组合二口设备TriplePin triplePin = new TriplePinAdapter(tv)// 不完美使用power.ConnectElectricity(triplePin );}

适配器模式 (Adapter Pattern) 总结

关键角色

  1. 目标角色(被适配)
  2. 适配角色(通过组合改变目标, 被不兼容的使用者使用)
  3. 使用者(固定, 或者旧系统代码)

适配器模式的优缺点

适配器模式的优点

  1. 将目标类和适配者类解耦, 通过引入一个适配器类来重用现有的适配者类, 无序修改原有结构
  2. 增加了类的透明性和复用性, 将具体业务实现过程封装在适配者类中, 对于客户端类而言是透明的, 而且提高了适配者的复用性, 同一个适配者类可以在多个不同的系统中复用.
  3. 灵活性和扩展性都非常好, 通过使用配置文件可以很方便的更换适配器, 也可以在不修改原有代码的基础上增加新的适配器类, 符合开闭原则.

适配器模式的缺点

  • 类适配器的缺点
    1. 对于Java等不支持多重继承的语言, 一次最多只能适配一个适配者类, 不能同时适配多个适配者
    2. 适配者类不能为被 final 修饰
  • 对象适配器的缺点
    1. 与类适配器模式相比较, 在该模式下要在适配器中置换适配者类的某些方法比较麻烦.

适配器模式适用的场景

  • 统一多个类的接口设计时

    某个功能的实现依赖多个外部系统(或者说类)。通过适配器模式, 将它们的接口适配为统一的接口定义

  • 需要依赖外部系统时

    当我们把项目中依赖的一个外部系统替换为另一个外部系统的时候, 利用适配器模式, 可以减少对代码的改动

  • 原有接口无法修改时或者原有接口功能太老旧但又需要兼容;

    JDK1.0 Enumeration 到 Iterator 的替换, 适用适配器模式保留 Enumeration 类, 并将其实现替换为直接调用 Itertor.

  • 适配不同数据格式时;

    Slf4j 日志框架, 定义打印日志的统一接口, 提供针对不同日志框架的适配器

代理、桥接、装饰器、适配器 4 种设计模式的区别

代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似. 但其各自的用意却不同

  1. 适配器模式的主要目的是:将一个类的接口转换为客户希望的另一个接口.适配器模式让那些不兼容的类可以一起工作
  2. 和 代理模式 的区别:适配器模式主要改变所考虑对象的接口, 而代理模式 主要目的是控制访问,不改变所代理类的接口
  3. 和 装饰器模式 的区别:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
  4. 和 桥接模式 的区别:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。

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

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

相关文章

CodeBuddy AI IDE:全栈AI创建平台实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

廊坊婚介所见证:放下挑剔的女人,幸福来得很快

在廊坊的一个小区门前,李珂总是喜欢把自己设定成“对未来丈夫的高标准”。她喜欢高大英俊,学历不低于硕士,收入稳定且在行业中有一定声望。对她来说,外表和地位才是婚姻成功的核心。于是她在网上投了不少简短而精致…

Tauri 窗口拖拽功能偶尔失效问题修复总结

窗口拖拽功能偶尔失效问题修复总结 问题描述 在 Tauri 应用的 Launcher 窗口中,用户发现拖拽功能存在一个奇怪的现象:✅ 输入框区域(wrapper):拖拽功能从不失效,非常可靠 ❌ 输入框上方区域(header 的其他部分,…

应用 SQLAlchemy 操作单表:以 SQLite 用户表为例的完整实战指南

应用 SQLAlchemy 操作单表:以 SQLite 用户表为例的完整实战指南2025-12-08 21:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

12-8午夜盘思

1、大盘无忧; 2、情绪方面:安记食品5连板,情绪周期强势延续;三市成交2万亿,抱团风格回归; 3、存储芯片:以存储芯片板块指数为锚点,板块上涨2.89%,板块强势;本质还是存储芯片涨价的故事;10cm方向,德明利领头…

MyBatis参数加解密

一、概述 在MyBatis中通过拦截器实现SQL参数加密/结果集解密是数据安全的常见场景,核心是拦截参数处理环节(加密入参)和结果集处理环节(解密出参)。适配Spring Boot3 + MyBatis环境。核心思路拦截点 作用 拦截接口…

基于Hadoop+数据可视化+机器学习随机森林预测算法+智能AI大模型+协同过滤推荐算法的青少年饮食习惯数据分析与可视化平台的设计与实现(精品源码+精品论文+上万材料集+答辩PPT)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PyTorch推理扩展实战:用Ray Data轻松实现多机多卡并行

单机 PyTorch 模型跑推理没什么问题,但数据量一旦上到万级、百万级,瓶颈就暴露出来了:内存不够、GPU 利用率低、I/O 拖后腿,更别说还要考虑容错和多机扩展。 传统做法是自己写多线程 DataLoader、管理批次队列、手…

成膜助剂出口厂商有哪些?有出口资质的成膜助剂供应商名单推荐

成膜助剂作为涂料、胶粘剂等行业的核心功能性辅料,其供应稳定性、产品质量及出口服务能力直接影响下游产业发展。2025年,随着环保政策升级与国际贸易格局优化,具备出口资质、合规性强的成膜助剂厂商与贸易公司愈发受…

CF1994G

CF1994G因为异或每个位是独立的,只需要处理进位即可。 因此,考虑从低到高枚举每一位,记录进位个数,令 \(dp(i, j)\) 表示到第 \(i\) 位,进了 \(j\) 位的方案数。暴力枚举 \(0/1\) 转移即可。 时间复杂度:\(O(nk)…

2025婴儿车性价比排行榜首选:UPPAbaby MINU V3如何以轻便全能理念重新定义价值标准(附权威认证)

一、轻便婴儿车市场的价值认知革新 根据《2024中国母婴消费白皮书》(中国家庭教育学会发布)数据显示,在选购婴儿车时,87.3%的消费者将"轻便性"列为首要考量因素,但同时也有76.8%的用户担心轻便设计会牺…

陈阅视觉摄影培训机构发展历程

陈阅视觉摄影培训机构,成立于2009年,10多年来,陈阅视觉秉承“让摄影更加简单”的办学使命。 引进国外先进视觉传达课程体系,并结合国内特点,独立研发PLTA摄影教学系统,大力培养摄影与视频制作人才,有力推动国内…

hive ddl dml hivesql命令大全

SELECT T.sname,T.ctfid,T.gender,t.address,count(*) OVER(PARTITION BY T.sname) AS FM_CNTFROM test_db.room3 T WHERE T.address like "%北京%" AND instr(T.ctfid,310)>0 ORDER BY FM_CNT DESC;sel…

杭州刑事案件法律咨询找谁?刑事律师推荐

遇到刑事案件,时间就是生命。杭州刑事案件法律咨询找谁?今天给大家推荐一家专业的刑事辩护律所。 刑事案件为什么要尽早找律师? 黄金37天很关键,刑事拘留期:最长37天这个阶段律师能做什么:会见当事人了解案情;申…

【AI】第一篇:语言模型的前世 n-gram的简单介绍

1. N-gram 是什么?核心逻辑与“N”的含义 N-gram 是自然语言处理(NLP)中一种基于统计的语言模型,其核心思想是:一个词的出现概率,可以由它前面 N-1 个词来预测。它把文本按照连续的 N 个词(或字符)切分成片段(…

【12.11 直播】时序数据库 IoTDB FAQ 全面解答|下一期聊什么?你来决定!

集中解答你最想知道的问题,你还想了解什么?请告诉我们!🤔你在用时序数据库 IoTDB 时,是否也遇到过这些“灵魂拷问”: 🚀为什么我的查询无法执行? 💡树模型、表模型到底该如何选? 🔑如何与现有系统进行高…

12/8

今天满课,全是专业课,写了个Java系统,后端打不开,气死我了,晚上还要写统一建模语言

洛谷 P8189

洛谷 P8189有 \(n\) 个礼物分配给 \(n\) 个人,第 \(i\) 个人原本拥有第 \(i\) 个礼物,每个人都要一个喜欢程度的列表,现在他们可以交换礼物,但每个人最后得到的礼物的喜欢程度不能低于原本的礼物。 \(T\) 组询问,…

计算机毕业设计springboot图书销售框架设计与构建 基于 SpringBoot 的在线书城营销平台构建与实战 SpringBoot 驱动的数字化图书商城系统研发

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

12月8日

你永远无法想象未来会发生什么!