23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解

  • 一、概念
  • 二、适配器模式结构
      • 适配器分类
      • 核心思想
      • 核心角色
      • 模式的UML类图
      • 应用场景
      • 模式优点
      • 模式缺点
  • 实例演示
      • 图示
      • 代码演示
      • 运行结果

一、概念

适配器模式(别名:包装器)
是一种结构型设计模式
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

二、适配器模式结构

适配器分类

1、类适配器模式(Class Adapter Pattern)

  • 定义;定义:类适配器模式通过继承被适配者(Adaptee)的类来实现适配器,并同时实现目标接口(Target)。由于Java不支持多继承,所以类适配器通常要求目标接口是一个接口,而不是抽象类。
  • 特点:由于采用继承模式,在适配器中可以重写被适配者原有的方法,使得适配器可以更加灵活。但是,由于Java是单继承模式,适配器类只能继承被适配者类,不能再额外继承其他类,这可能导致一定的局限性。

2、对象适配器模式(Object Adapter Pattern)

  • 定义:对象适配器模式通过持有被适配者的实例,并在适配器中实现目标接口,将客户端的调用请求转换为对被适配者的调用。
  • 特点:对象适配器模式规避了单继承的劣势,将被适配者类用引用的方式传递给适配器,这样可以传递的是被适配者对象本身及其子类对象。这种模式更加开放,但同时也需要自己重新定义被适配者接口,可能增加额外的操作。

3、接口适配器模式(Default Adapter Pattern)

  • 定义:接口适配器模式也称为默认适配器模式或空对象模式。当接口中的方法很多,而客户端只需要关心其中的一部分方法时,可以使用接口适配器模式来简化客户端的实现。
  • 特点:接口适配器模式允许客户端只关心自己需要的方法,而无需实现接口中的所有方法,从而简化了客户端的实现。在JDK类库的事件处理包java.awt.event中,如WindowAdapter、KeyAdapter、MouseAdapter等都使用了接口适配器模式

核心思想

把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

  • 例子:用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。

核心角色

  • 目标接口(Target):定义客户端使用的目标接口,客户端通过调用这个接口中的方法来访问适配器的功能。
  • 适配器(Adapter):实现目标接口,并在内部持有一个被适配者的实例。适配器将客户端的请求委派给被适配者来完成具体的功能。
  • 被适配者(Adaptee):定义了一个已存在的接口,但与目标接口不兼容,需要被适配器进行转换。

模式的UML类图

在这里插入图片描述

应用场景

1.旧系统接口升级:当系统升级后,新的接口可能与旧的接口不兼容。此时,可以使用适配器模式来包装旧系统的类,使其符合新系统的接口要求,从而无需修改旧系统的代码。
2.第三方库集成:当使用第三方库时,可能会发现库的接口并不符合项目的要求。通过使用适配器模式,可以创建适配器类来适配第三方库的接口,使其更容易集成到项目中。
3.多种数据库操作:在项目中可能需要支持多种数据库,每种数据库的操作接口可能不同。通过适配器模式,可以创建多个适配器类来适配不同的数据库接口,从而提供统一的数据库操作接口。
4.插件系统:在构建插件系统时,不同的插件可能具有不同的接口。通过适配器模式,可以创建适配器类来统一插件的接口,使得主程序可以更方便地与插件进行交互。
5.硬件接口适配:在软件与硬件通信的场景中,硬件提供的接口可能与软件需要的接口不匹配。通过适配器模式,可以编写软件适配器来适配硬件的接口,从而简化软件的开发

模式优点

  • 安全可靠:封装了旧接口,对客户端透明,客户端代码无需修改。
  • 提高复用性:可以复用不兼容的类;可以对不同的类无需修改,就可以进行组合。
  • 扩展性好:适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。
  • 目标(Target)和被适配者(Adaptee)是完全解耦的关系。

模式缺点

  • 过多的适配器会导致系统结构复杂。
  • 如果适配器没有实现好,可能会拖慢整个系统的性能。
  • 滥用适配器模式会导致系统设计紊乱。
  • 适配器模式需要增加一个额外的适配器类,增加了代码的量

实例演示

图示

在这里插入图片描述

代码演示

package task1;

public interface DBSocketInterface {
	public void powerWithTwoRound(); 

}

package task1;

public interface GBSocketInterface {
	public void powerWithThreeFlat();

}

package task1;

public class DBSocket implements DBSocketInterface {

	@Override
	public void powerWithTwoRound() {
		// TODO Auto-generated method stub
		System.out.println("使用两项圆头的插孔供电");
	}

}

package task1;

public class SocketAdapter implements DBSocketInterface {
	private GBSocketInterface gbSocket;

	public SocketAdapter(GBSocketInterface gbSocket) {
		// TODO Auto-generated constructor stub
		this.gbSocket = gbSocket;

	}

	@Override
	public void powerWithTwoRound() {
		// TODO Auto-generated method stub
		gbSocket.powerWithThreeFlat();

	}

}

package task1;

public class GBSocket implements GBSocketInterface {

	@Override
	public void powerWithThreeFlat() {
		// TODO Auto-generated method stub
		System.out.println("正在使用三项扁头插头供电");
		
	}

}

package task1;

public class Hotel {
	private DBSocketInterface dbSocket;

	public void setSocket(DBSocketInterface dbSocket) {
		this.dbSocket = dbSocket;
	}

	public void charge() {
		dbSocket.powerWithTwoRound();
	}

}

测试类:

package task1;

public class Test {
	public static void main(String[] args) {
		GBSocketInterface gbSocket = new GBSocket();
		Hotel hotel = new Hotel();
		SocketAdapter socketAdapter = new SocketAdapter(gbSocket);
		hotel.setSocket(socketAdapter);
		hotel.charge();
	}     

}

运行结果

在这里插入图片描述
在上面的代码中, GBSocket 是目标接口的具体实现类, SocketAdapter 是适配器接口的具体实现类,并且持有一个目标接口的引用。在客户端中,我们创建了一个目标接口的实例和一个适配器接口的实例,然后通过适配器接口调用目标接口的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

存内计算与扩散模型:下一代视觉AIGC能力提升的关键

目录 前言 视觉AIGC的ChatGPT4.0时代 扩散模型的算力“饥渴症” 存内计算解救算力“饥渴症” 结语 前言 ​ 在这个AI技术日新月异的时代,我们正见证着前所未有的创新与变革。尤其是在视觉内容生成领域(AIGC,Artificial Intelligence Generate…

家政预约小程序12用户登录

目录 1 创建全局变量2 创建页面3 搭建页面4 实现登录逻辑总结 在小程序中,登录是一个常见的场景。比如我们在小程序预约或者购买时,通常要求用户先登录后购买。如果使用传统方案,登录这个动作其实最终的目的是为了获取用户的openid。而使用低…

如何理解与学习数学分析——第一部分——数学分析概观

第1 部分:数学分析概观(Studying Analysis) 1. 数学分析之面目(What is Analysis like?) 本章说明了分析中的定义、定理和证明。 它介绍了一些符号,并解释了如何使用数学分析中的这些数学符号和数学词汇、以及应该把它们读成什么。它指出了这种类型的…

【通俗易懂搞算法】一篇文章弄懂Manacher算法

Manacher算法 manacher算法解决的问题回文 最长回文子串最长回文子串解法解法1.0解法2.0Manacher算法回文半径、回文直径回文半径数组之前扩的所有位置中所到达的最右回文右边界(R)取得更远边界的中心点的位置(C)Manacher算法优化情形Manacher算法优化情形总结 manacher算法代码…

PySpark特征工程(I)--数据预处理

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

工业网关有效解决企业在数据采集、传输和整合方面的痛点问题-天拓四方

一、企业背景概述 随着信息技术的飞速发展,工业互联网已成为推动制造业转型升级的关键力量。在众多工业企业中,某公司凭借其深厚的技术积淀和广阔的市场布局,成为行业内的佼佼者。然而,在数字化转型的道路上,该公司也…

Java中getBytes()方法

我以为旅人将我 热情都燃尽 —— 24.6.4 String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示 而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“深”字时,这个new String(byte[],…

【UML用户指南】-07-对基本结构建模-公共机制

目录 1、术语和概念 1.1、注解(note) 1.2、修饰 1.3、衍型 1.4、标记值 1.5、约束 1.6、标准元素 1.7、外廓(profile) 2、对新特性建模 3、对新语义建模 注解 (note)是附加在元素或元素集上用来表…

EcoVadis审核方法是什么符合EcoVadis规范的文件清单

EcoVadis审核方法是参照全球契约社会责任国际标准进行,包括环境、劳工及人权、商业道德、可持续采购等四大主题又分:能源消耗及温室气体排放、水环境管理、生态环境与物种多样性保护、局部环境污染、原材料及化学品使用(含废弃物)、产品使用、产品生命末期、消费者健…

控制应优先

先从大体上的去找规律,然后才是数字归纳(更为详细的),同时控制关系应该优先(这里是天数和位置)。是否涉及所有对象不是广泛,如果是具体的数值就不是广泛。

天润融通携手好丽友,打造食品零售行业智能客服新标杆

AI大模型,如何给食品零售行业的客服服务带来质变? 在很多人印象中,食品零售行业是不需要客户服务的。 因为绝大多数食品都是通过经销商、零售商、商场这样的渠道进行销售。所以在食品零售行业,一直都有一句话,叫“渠…

贝加莱工控机维修5PC810.SX01-00 APC810系列

工控机维修常见故障:工控机无显示、自检不过、死机、触摸不灵、按键无法操作、与PLC通讯不上驱动器报过流过载、电压高、编码器错误 等。 PLC有输入无输出、报错等工控机维修常见故障现象 。 贝加莱工控机维修常见故障排查: 电源灯亮但工控机没有反应: …

ChatTTS:对话式文本转语音模型,开源啦!突破开源语音天花板...

最近,一个名为 ChatTTS 文本转语音项目爆火出圈,短短三天时间,在 GitHub 上已经斩获了 9.2 k 的 Star 量。 ChatTTS:对话式文本转语音模型 项目地址:https://github.com/2noise/ChatTTS/tree/main 体验地址&#xff1a…

Houdini pbd_constraints.h的文件位置

Houdini安装目录下的houdini\vex\include文件夹 C:\Program Files\Side Effects Software\Houdini 19.5.716\houdini\vex\include

Codeforces Round 950 (Div. 3)(A~E题解)

这场比赛我自己打的是真的垃圾,也是侥幸被拿下了,第三题当时没想清楚,要不然还能止损一下,惜败惜败 话不多说,现在来看A~E题的题解 A. Problem Generator 题解:这题水题一个,我们来考虑本题的…

学会 YOLOv8 直接上手 YOLOv10 | YOLOv8 YOLOv10 模型结构 Yaml 文件对比

先来对比下 模型 yaml 文件, YOLOv8 的 5 个模型尺寸是写到一起的,也就是说,YOLOv8 的 5个尺寸之间就是宽度和深度等比例缩放; YOLOv10 的 6 个模型尺寸是分开写的,10 并不是简单的宽度和深度等比例缩放,…

正邦科技七:pycharm的使用

Pycharm的使用 1:下载python解释器:https://www.python.org/downloads/windows/ 2:下载Pycharm社区办:去官网下载(不需要跟Java一样配置jdk这种环境) 需要注意一点如果是别人发的包解压之后不能直接用&…

C++期末复习

目录 1.基本函数 2.浅拷贝和深拷贝 3.初始化列表 4.const关键字的使用 5.静态成员变量和成员函数 6.C对象模型 7.友元 8.自动类型转换 9.继承 1.基本函数 (1)构造函数,这个需要注意的就是我们如果使用类名加括号,括号里面…

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…

实验室类管理平台LIMS系统的ui设计实例

实验室类管理平台LIMS系统的ui设计实例