适配器模式【对象适配器模式和类适配器模式,以及具体使用场景】

2.1-适配器模式

​ 类的适配器模式是把适配者类的API转换成为目标类的API,适配器模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作,其实在具体的开发中,对于自己系统一开始的设计不会优先考虑适配器模式,通常会将接口设置成兼容的,但是难免会有设计的缺陷,导致接口不兼容的类需要一起工作,这时候就可以使用适配器模式进行转换;其次适配器模式经常用于接入第三方系统,由于第三方系统与我们系统不兼容,我们也不会因为接入这个三方系统而去修改我们现有的接口,因此一般会使用适配器模式进行接口转换。

适配器模式主要包含如下几种角色

  • 适配器类:适配器模式的核心,里面编写适配转换的代码,是一个类
  • 目标类:最终客户端所需要的接口,可以是接口、抽象类、具体类,在适配器中,由于Java不支持类的多继承,因此在Java的类适配器模式中只能是接口,在对象适配器模式中可以是类
  • 适配者类:里面包含了客户端所需要的API,适配者类一般是一个具体的类

​ 适配器模式主要包括两种实现形式,类适配器对象适配器,其实这两种的主要区别就在于适配者类所处的位置,接下来我们分别介绍

2.1.1-类适配器模式

​ 类适配器模式中,适配器类会实现目标类,然后继承适配者类,由于Java类不能多继承,所以适配器模式中目标类只能是一个接口,代码示例如下:

适配者类

/*** 适配者* @author Liu Hanlin* @create 2024-09-30 22:14*/
public class ClsAdaptee {/*** 基础请求API* @return*/public String baseRequestAPI(){return "基础请求API";}
}

目标类

/*** 目标类* @author Liu Hanlin* @create 2024-09-30 22:13*/
public interface ClsTarget {/*** 目标请求API* @return*/String request();
}

适配器类

/*** 类适配器* @author Liu Hanlin* @create 2024-09-30 22:12*/
public class ClsAdapter extends ClsAdaptee implements ClsTarget{@Overridepublic String request() {return this.baseRequestAPI();}
}
2.1.2-对象适配器模式

​ 对象适配器模式中,适配器类会继承或实现目标类,然后将适配者类作为适配器的一个属性,在重写目标类的方法时,调用适配者类的方法,具体代码如下

适配者类

/*** 适配者类* @author Liu Hanlin* @create 2024-09-30 22:20*/
public class ObjAdaptee {/*** 基础请求API* @return*/public String baseRequestAPI(){return "基础请求API";}
}

目标类

/*** 目标类【对象适配器模式中,目标类可以是抽象类和具体类】* @author Liu Hanlin* @create 2024-09-30 22:21*/
public abstract class ObjTarget {/*** 目标请求API* @return*/abstract public String request();
}

适配器类

/*** 适配器* @author Liu Hanlin* @create 2024-09-30 22:20*/
public class ObjAdapter extends ObjTarget{ObjAdaptee adaptee = new ObjAdaptee();@Overridepublic String request() {return adaptee.baseRequestAPI();}
}

如上就是适配器模式的具体代码以及具体解释。

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

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

相关文章

leetcode69--x的平方根

方法一 直接进行简单的循环遍历&#xff0c;找到符合条件的值返回结果即可 class Solution {public int mySqrt(int x) {for (int i 0; i < x; i) {if ((long)i * i < x && (long)(i 1) * (i 1) > x) {return i;}}return -1; // 这个返回值实际上不会被触…

解析TMalign文本文件中的转换矩阵

TM-align 将两个蛋白质结构通过旋转和位移对齐后&#xff1a; TMalign test1.pdb test2.pdb -m mtx.txt 输出转换矩阵&#xff0c;文件内容为&#xff1a; ------ The rotation matrix to rotate Chain_1 to Chain_2 ------ m t[m] u[m][0] u[…

SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考

视频分割功能(Splitter)支持各种编码格式的AVI(DivX、DV、MJPEG、XVID、MPEG-4)、WMV、ASF(DivX、MJPEG、XVID、MPEG-4、WM Video 7/9)F、MPEG(*.mpg、*.mpeg、*.mpv、*.m2v、*.vob)文件、也支持受损的WMV、ASF格式的分割。视频合并功能(Joiner)则支持AVI、WMV/ASF、WMA、MP3、…

从DBA是“擦车的”谈起

前段时间有网友在群里讨论&#xff0c;把数据库代码工作者比做是造车的&#xff0c;业务应用开发人员是开车的&#xff0c;而数据库管理员(DBA)则是擦车的。有网友评论这句话&#xff0c;“伤害性不大&#xff0c;侮辱性极强”。说实在的&#xff0c;个人觉得这个说法虽然有些偏…

gdb 调试 linux 应用程序的技巧介绍

使用 gdb 来调试 Linux 应用程序时&#xff0c;可以显著提高开发和调试的效率。gdb&#xff08;GNU 调试器&#xff09;是一款功能强大的调试工具&#xff0c;适用于调试各类 C、C 程序。它允许我们在运行程序时检查其状态&#xff0c;设置断点&#xff0c;跟踪变量值的变化&am…

指针 (5)

目录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5.typedef 关键字 6 函数指针数组 7.转移表 计算器的⼀般实现 1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* #include <stdio.h> int main() {char* ch …

VB.net读写NDEF标签URI智能海报WIFI蓝牙连接

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 Public Class Form1Dim oldpicckey(0 To 5) As Byte 卡片旧密码Dim newpicckey(0 To 5) As Byte 卡片新密码Function GetTagUID() As StringDim status As ByteDim myctrlword As …

AndroidStudio编译问题

AndroidStudio 很多时候会出现提示插件解析失败问题。可按如下步骤进行排查&#xff1a; 1. 翻墙后点击sync 按钮去同步&#xff1b;如果网络没问题&#xff0c;但一直同步失败&#xff0c;可试2. 2. C:\Users\[yourName]\.gradle\caches 中用git bash 等客户端工具去搜同步不…

矩阵系统源码搭建的具体步骤,支持oem,源码搭建

一、前期准备 明确需求 确定矩阵系统的具体用途&#xff0c;例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块&#xff0c;如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言&#xff0c;如 Python、Java、Node.js 等。确定数据库类型&…

Activiti7 工作流引擎学习

目录 一. 什么是 Activiti 工作流引擎 二. Activiti 流程创建步骤 三. Activiti 数据库表含义 四. BPMN 建模语言 五. Activiti 使用步骤 六. 流程定义与流程实例 一. 什么是 Activiti 工作流引擎 Activiti 是一个开源的工作流引擎&#xff0c;用于业务流程管理&#xf…

Linux开发讲课45--- 链表

Linux内核代码中广泛使用了数据结构和算法,其中最常用的有链表、队列kfifo、红黑树、基数树和位图。 链表 Linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。 链表所包含的元素可以动态创建并插入和删除。链表的每个元素…

【经典机器学习算法】谱聚类算法及其实现(python)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 前…

躺平成长:微信小程序运营日记第二天

在进行属于生活的开源之后&#xff0c;自己更加感受到自己存在的渺茫&#xff0c;同时更加开始深刻领会&#xff0c;开源的重要性&#xff0c;在开源&#xff0c;开放&#xff0c;创造&#xff0c;再创新的思维模式下&#xff0c;不发布八部金刚功相关的训练视频&#xff0c;自…

每日一题|983. 最低票价|动态规划、记忆化递归

本题求解最小值&#xff0c;思路是动态规划&#xff0c;但是遇到的问题是&#xff1a;动态规划更新的顺序和步长&#xff0c;以及可能存在的递归溢出问题。 1、确定dp数组含义 dp[i]表示第i天到最后一天&#xff08;可能不在需要出行的天数里&#xff09;&#xff0c;需要花费…

Suricata:开源网络分析和威胁检测

Suricata 是一款高性能、开源网络分析和威胁检测软件&#xff0c;被大多数私人和公共组织使用&#xff0c;并被主要供应商嵌入以保护他们的资产。 Suricata 功能 Suricata 提供全面的网络安全监控 (NSM) 功能&#xff0c;包括记录 HTTP 请求、捕获和存储 TLS 证书以及从网络流…

汽车3d动画渲染选择哪个?选择最佳云渲染解决方案

面临汽车3D动画渲染挑战&#xff1f;选择正确的云渲染服务至关重要。探索最佳解决方案&#xff0c;优化渲染效率&#xff0c;快速呈现逼真动画。 汽车3d动画渲染选择哪个&#xff1f; 对于汽车3D动画渲染&#xff0c;选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…

Vue3 工具函数(总结)

目录 前言 1.isRef 2.isReactive 3.isReadonly 4.isProxy 5.toRef 6.toRefs 7.unref 8.shallowRef 9.shallowReactive 10.triggerRef 11.customRef 12.markRaw 13.toRaw 14.readonly 15.watchEffect 前言 在 Vue 3 中&#xff0c;除了核心的响应式 API&#x…

yolov8/9/10模型在安全帽、安全衣检测中的应用【代码+数据集+python环境+GUI系统】

yolov8910模型安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 背景意义 安全帽和安全衣在工业生产、建筑施工等高风险作业环境中是保护工人免受意外伤害的重要装备。然而&#xff0…

开源软件简介

一、开源运动的发起 近几十年&#xff0c;软件已经称为战略性的社会资源。各大软件供应商传统的对外封锁源代码的运营模式虽说有积极的一面&#xff0c;比如可以维护开发商的利益&#xff0c;使其可以持续地维护进一步开发的能力&#xff0c;以及可以保护软件商及客户的私密信息…

Qt 学习第十一天:QTableWidget 的使用

一、创建QTableWidget对象&#xff0c;设置大小&#xff0c;在窗口的位置 //创建tablewidgetQTableWidget *table new QTableWidget(this);table->resize(550, 300);table->move(100, 100); //移动 二、设置表头 //设置表头QStringList headerList; //定义headerList…