【设计模式-适配】

Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性。

核心思想

适配器模式的核心思想是“将一个类的接口转换成客户期望的另一个接口”,使得两个不兼容的接口能够相互合作。适配器模式可以将现有类的接口与客户端所需的接口进行匹配,达到接口兼容的目的。

组成部分

  • Target(目标接口): 这是客户端期望的接口,通常是你希望进行适配的接口。目标接口可以是一个抽象类或接口。

  • Adaptee(适配者): 这是需要适配的已有接口,可能是一个已经存在的类或接口。适配者类具有客户端需要的功能,但接口与目标接口不兼容。

  • Adapter(适配器): 适配器类实现了目标接口,并持有一个适配者对象的引用。它通过将目标接口的方法委托给适配者对象,实现了接口的转换。

UML图

在这里插入图片描述

Java代码

以下是一个简单的 Java 示例,展示了如何实现适配器模式。假设我们有一个旧版的 OldPrinter 类,它的接口不符合客户端的要求,而客户端需要一个符合 Printer 接口的类。

// Target
interface Printer {void print(String text);
}// Adaptee
class OldPrinter {public void printDocument(String text) {System.out.println("Printing document: " + text);}
}// Adapter
class PrinterAdapter implements Printer {private OldPrinter oldPrinter;public PrinterAdapter(OldPrinter oldPrinter) {this.oldPrinter = oldPrinter;}@Overridepublic void print(String text) {oldPrinter.printDocument(text);}
}// Client
public class AdapterPatternExample {public static void main(String[] args) {OldPrinter oldPrinter = new OldPrinter();Printer printer = new PrinterAdapter(oldPrinter);// Client uses Printer interfaceprinter.print("Hello, Adapter Pattern!");}
}

解释

  • Target(Printer): 这是客户端所期望的接口,它定义了 print 方法。

  • Adaptee(OldPrinter): 这是现有的接口,它定义了 printDocument 方法,这个方法的接口与 Printer 不兼容。

  • Adapter(PrinterAdapter): 适配器类实现了 Printer 接口,并持有一个 OldPrinter 对象。适配器的 print 方法将调用 OldPrinter 的 printDocument 方法,从而实现了接口的适配。

优点

  • 兼容性: 使得原本不兼容的接口可以协同工作,扩展了类的功能。

  • 提高复用性: 适配器模式可以将现有的类与新的接口结合,复用现有的类功能而不需要修改它们。

  • 简化客户端代码: 客户端代码只需要依赖目标接口,而不需要关心适配者的细节。

缺点

  • 增加复杂性: 适配器模式可能会引入额外的适配器类,使得系统的复杂性增加。

  • 性能开销: 由于适配器需要做额外的接口转换,可能会有一定的性能开销。

使用场景

  • 旧系统与新系统的集成: 当你需要将一个旧系统与一个新系统进行集成,但它们的接口不兼容时,适配器模式可以帮助你实现这一点。

  • 第三方库的集成: 在使用第三方库时,库的接口可能与应用的需求不一致,适配器模式可以用来解决接口不匹配的问题。

  • 接口转换: 需要将接口从一种形式转换为另一种形式时,比如在不同的模块之间进行通信。

实现方式

  • 类适配器: 通过继承方式实现适配器模式。这种方式需要利用多重继承(在 Java 中通过组合实现),适配器类继承了适配者,并实现了目标接口。

  • 对象适配器: 通过组合方式实现适配器模式。适配器类持有一个适配者对象的引用,并实现目标接口,适配器类将目标接口的请求委托给适配者对象处理。

总结

适配器模式通过引入适配器,将不兼容的接口转换为客户端所期望的接口,从而实现接口的兼容性。这种模式可以使系统更加灵活,减少系统的耦合,提高复用性。适配器模式特别适用于集成不兼容的接口或者引入已有的类库时。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

STM32cubeMX + VScode开发GD32移植(HAL库通用),保姆级!!!!!!!

STM32cubeMX VScode开发GD32移植(HAL库通用),保姆级!!!!!!! 文章目录 STM32cubeMX VScode开发GD32移植(HAL库通用),保姆级!!!&#…

API接口什么意思?电商API接口有什么作用

API接口简介: 从技术层面上来看,API是一系列函数、协议和工具,它们定义了软件组件如何交互,让开发者无需了解对方内部工作原理就可以使用对方的功能或服务。 事实上,API接口在电商行业中的应用较为广泛。 具体来看&…

MFC 使用细节

MFC 使用细节 1. MFC:在共享 DLL 中使用 MFC 或者在静态库中使用 MFC 的区别 在共享 DLL 中使用 MFC:这种方式下,MFC DLL 的内容不会包含在您的 EXE 文件中。因此,生成的 EXE 文件较小,但运行时需要系统中有相关的 M…

linux第三课(linux中安装nginx与redis及SpringBoot集成redis)

目录 一.nginx引入 二.关于nginx 1.什么是nginx 2.nginx的特点 3.在nginx中安装nginx 三.关于redis 1.背景引入 2.什么是redis 3.redis的特点 4.在linux下的docker中安装redis 四.redis中的数据结构 (1)String(字符串) (2)Hash (3)list(列表) (5)zset(sorted se…

【AI大模型应用开发】文本向量化与向量相似度(附Python代码)

本文介绍下文本向量化的概念,以及向量检索的原理,只是简单介绍,不会深入,所以不用担心看不懂,想要详细研究的,可以去搜相关论文,涉及到机器学习和模型训练等。 0. 文本向量 0.1 什么是文本向量…

计算机三级网络技术总结(四)

路由刷新表报文主要内容是由若干(V、D)组成的表每一个区域OSPF拥有一个32位的区域标识符当链路状态发生变化时用洪泛法向所有路由器发送信息不能用于网络嗅探的是NS-2(NS-2是一种针对网络技术的源代码公开的、免费的软件模拟平台,…

Java项目实战II基于Java+Spring Boot+MySQL的洗衣店订单管理系统(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着生活节奏的加快,现代人对便捷、高效服务的需求日益增长,洗衣店作为日常生…

力扣 中等 2300.咒语和药水的成功对数

文章目录 题目介绍解法 题目介绍 解法 class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success){Arrays.sort(potions);int n spells.length, m potions.length;int[] pairs new int[n];for (int i 0; i < n; i) {int left 0, righ…

【如何使用Python操作Kafka】

如何使用Python操作Kafka 1、安装kafka pip install kafka2、直接编写Kafka工具脚本 kafka_tools.py # -*- coding: utf-8 -*-import json from kafka import KafkaConsumer, KafkaProducerclass KProducer:def __init__(self, username_ip, topic):"""kafk…

【算法篇】栈与队列类(笔记)

目录 一、用栈实现队列 二、用队列实现栈 三、有效的括号 四、删除字符串中的所有相邻重复项 五、逆波兰表达式求值 六、滑动窗口最大值 七、前 K 个高频元素 一、用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/proble…

[PTA]7-6 吃火锅

[PTA]7-6 吃火锅 以上图片来自微信朋友圈&#xff1a;这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”&#xff0c;那就厉害了&#xff0c;我们的故事就开始了。 本题要求你实现一个程序&#xff0c;自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。 …

手写Spring

简单实现Spring基于注解配置 ComponentScan Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface ComponentScan {String value() default ""; } 相当于component-scan HspSpringConfig ComponentScan(value "spring.write.com…

两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力

今天就遇到有点儿dt的问题&#xff0c;利用大模型顺利通了自定义的工具调用&#xff08;并没有用到tools功能&#xff0c;而是通过prompt强制输出&#xff09;&#xff0c;单个单个的没问题哈&#xff0c;但是多个一起就出现问题了 我说“关闭电脑PC1, 打开第2台电脑” 它看不懂…

安卓实现导入Excel文件

使用简化版的jar包 api files(libs/poi-3.12-android-a.jar) api files(libs/poi-ooxml-schemas-3.12-a.jar) 导入遇到了两个兼容问题 1.build.gradle文件里面 android { 要添加 packagingOptions {exclude META-INF/INDEX.LIST } 2.加载大文件要在清单文件里面加androi…

网络变压器HR911130C的使用注意点

HR911130C的使用&#xff0c;需要2个注意点&#xff1a; 1&#xff09;数据线data0、data2、data3是相邻的引脚&#xff0c;但是data1是 不相邻的两个引脚&#xff0c;注意看下面的电路图&#xff0c;所以绘图时需要注意 2&#xff09;LED灯的连接 11脚、12脚&#xff0c;连…

快手可灵AI全球升级1.5模型:引入“运动笔刷”功能 画质大幅提升

9月19日&#xff0c;快手公司宣布其可灵AI模型进行了全球范围内的重磅升级&#xff0c;推出了1.5版本。新版本在多个方面实现了显著提升&#xff0c;包括视频画质、动态效果、美学表现、运动合理性以及语义理解等。 新升级的1.5模型支持在高品质模式下直接输出1080p高清视频&am…

【CSS】一行三个盒子 每个盒子都是16:9

padding-top 属性接受百分比值时,其百分比是基于父元素的宽度来计算的,而不是自身元素的宽度 aspect-ratio 更方便&#xff0c;但存在兼容性问题 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&quo…

字符设备驱动 — 4 异常与中断

异常与中断 中断属于异常的一种 异常会直接打断 CPU 的运行&#xff0c;而各种中断会被传到中断控制器&#xff0c;由中断控制器来选择优先级最高的中断并通知 CPU 处理流程 arm 对异常&#xff08;中断&#xff09;处理流程&#xff1a; 初始化&#xff1a; 设置中断源&…

水经微图PC版5.0.0即将内测

让GIS更简单高效&#xff01; 水经微图&#xff08;以下称“微图”&#xff09;PC版5.0.0即将内测&#xff0c;这是一个基于WeMapEngine开发的全新版本。 关于什么是WeMapEngine&#xff0c;请从《WeMapEngine可快速构建的GIS应用功能》一文中了解。 微图5.0.0功能界面 水经…

【分享】“可恶”的运算放大器电容负载

他们说如果使用放大器驱动电容负载(图 1、CLOAD)&#xff0c;一个不错的经验是采用一个 50 或 100 欧的电阻器 (RISO) 将放大器与电容器隔开。这个附加电阻器可能会阻止运算放大器振荡。 图 1.支持电容负载的放大器可能需要在放大器输出与负载电容器之间连接一个电阻器。 使用…