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 {@Overridepublic void powerWithTwoRound() {// TODO Auto-generated method stubSystem.out.println("使用两项圆头的插孔供电");}}package task1;public class SocketAdapter implements DBSocketInterface {private GBSocketInterface gbSocket;public SocketAdapter(GBSocketInterface gbSocket) {// TODO Auto-generated constructor stubthis.gbSocket = gbSocket;}@Overridepublic void powerWithTwoRound() {// TODO Auto-generated method stubgbSocket.powerWithThreeFlat();}}package task1;public class GBSocket implements GBSocketInterface {@Overridepublic void powerWithThreeFlat() {// TODO Auto-generated method stubSystem.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 是适配器接口的具体实现类,并且持有一个目标接口的引用。在客户端中,我们创建了一个目标接口的实例和一个适配器接口的实例,然后通过适配器接口调用目标接口的方法。

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

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

相关文章

Linux ip命令常用操作

ip 命令来自 iproute2 软件包,在 CentOS 7 中默认已安装(yum install -y iproute)。 iproute2 软件包提供了很多命令(rpm -ql iproute |grep bin),如 ss 命令、bridge,这些命令可以完全替代 if…

学生宿舍人走断电系统的开发

学生宿舍人走断电管理系统是一款智能化的电力管理设备,旨在解决学生宿舍用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人,当无人时自动断电,避免能源浪费和事故的发生。 2.:系统具有过载保护、短路保护、过…

OCP-042之:Oracle结构体系

1. Oracle结构体系 1.1 概述 1.1.1 版本 版本后缀所代表的含义 i:代表基于Internet架构的数据库,如9i g:代表基于grid(网格)的数据库,如11g grid的目的:降低成本,提高服务质量,简化管理 Storage Grid:ASM(automatic storage management),继承了LVM技术,Oracl…

16_ Vue.js高级指南:条件渲染、列表渲染与数据双向绑定

文章目录 1. 条件渲染v-if2. 列表渲染v-for3. 数据双项绑定v-model4. 计算属性Appendix 1. 条件渲染v-if v-if标签直接接收函数或boolean类型变量 v-if 为true,则当前元素会进入到dom树v-else会自动执行 前方v-if的取反操作 v-show v-show值为true则值展示值不展示…

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力,而独立按键则提供了一种简单的输入方式。 当把独立按键与 …

LeetCode72编辑距离

题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组,尺寸和这两个字符串的长度相等,用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的,只不过相比1143的一种方式,变成了三种方式,就…

微型丝杆与滚珠丝杆性能差异与适用场景!

滚珠丝杆是工具机械和精密机械上最常使用的传动元件,其主要功能是将旋转运动转换成线性运动,或将扭矩转换成轴向反复作用力。同时兼具高精度、可逆性和高效率的特点。而微型丝杆是一种直径为0.5mm以下且线性误差在几微米以内,精度高、传动稳定…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream,用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

【Gitlab】Gitlab MAC M1通过Docker Desktop安装教程

一、拉取镜像 docker pull yrzr/gitlab-ce-arm64v8 二、配置容器 2.1 配置Volumes 镜像下载完成后,可在Docker Desktop看到镜像 点击run,弹出以下界面,配置端口映射和目录挂载后,即可生成一个容器 配置Volumes Host PathCont…

机器学习--回归模型和分类模型常用损失函数总结(详细)

文章目录 引言 回归模型常用损失函数均方误差(Mean Squared Error, MSE)均方根误差(Root Mean Squared Error, RMSE)平均绝对误差(Mean Absolute Error, MAE)Huber损失(Huber Loss) …

【HTTP系列】HTTP1.0/1.1/2.0 的区别

文章目录 一、HTTP1.0二、HTTP1.1三、HTTP2.0# 多路复用二进制分帧首部压缩服务器推送 四、总结HTTP1.0:HTTP1.1:HTTP2.0: 参考文献 一、HTTP1.0 HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本 HTTP 1.0 浏览器…

学习笔记——路由网络基础——环回接口(loopback)

6、环回接口(loopback) (1)定义 环回接口(loopback) :是一种虚拟的接口,是一种纯软件性质的虚拟接口,模拟一个单独的网段。 Loopback等于在设备中模拟另外不同的网络,实现不需要物理接口连接设备,依然可以模拟的功能…

海思Hi3519DV500方案1200万无人机吊舱套板

海思Hi3519DV500方案1200万无人机吊舱套板 Hi3519DV500 是一颗面向行业市场推出的超高清智能网络摄像头SoC。该芯片最高 支持四路sensor 输入,支持最高4K30fps 的ISP 图像处理能力,支持2F WDR、 多级降噪、六轴防抖、全景拼接、多光谱融合等多种传统图像…

【Python】一文向您详细介绍 `__dict__` 的作用和用法

【Python】一文向您详细介绍 __dict__ 的作用和用法 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕…

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】

【Less-42】 使用 or 11 -- aaa 密码,登陆成功。 找到注入点:密码输入框。 解题步骤: # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

【教程】让小爱音箱Play增强版接入Mi-GPT

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 项目地址:https://github.com/idootop/mi-gpt MiIOT:小米小爱音箱Play 增强版 - 产品规格 - Xiaomi Miot Spec 实现效果图&…

数据库(27)——多表查询——自连接

语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 自连接可以是内连接查询也可以是外连接查询。 演示 我新增了字段friend便于演示 查询所有人的名字以及他们的friend的人的名字: select a.name,b.name from user a,user b where a.friendb.id; 其…

【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)

目录 数据结构——查找何为查找1. 查找表2. 关键字3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length) 静态查找表1.顺序查找2.二分查找二分查找判定树 3.静态查找表—索引顺序表的查找索引顺序查找表的算法原理: 动态查找树表1. 二叉排序树2. 二叉…

06 Linux 设备驱动模型

1、Overview Linux-2.6 引入的新的设备管理机制 - kobject 降低设备多样性带来的 Linux 驱动开发的复杂度,以及设备热拔插处理、电源管理等将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口驱动的开发,就简化为对内核所规定的数据结构的填充和实现驱动模型是 Linu…

Go微服务: 分布式之通过本地消息实现最终一致性和最大努力通知方案

通过本地消息实现最终一致性 1 )概述 我们的业务场景是可以允许我们一段时间有不一致的消息的状态的,并没有说必须特别高的这个消息的一致性比如说在TCC这个架构中,如果采用了消息的最终一致性,整体架构设计要轻松好多即便我们库…