Java设计模式-结构型-适配器模式

news/发布时间2024/6/8 4:05:59

Java设计模式-结构型-适配器模式

一、概述

​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器让那些由于接口不兼容而不能交互的类可以一起工作。

适配器模式可以将一个类的接口和另一个类的接口匹配起来,而无须修改原来的适配者接口和抽象目标类接口。适配器模式定义如下:

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

所以,适配器模式比较适合以下场景:

  • (1)系统需要使用现有的类,而这些类的接口不符合系统的接口。
  • (2)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

二、实现方式

对象适配器模式和类适配器模式

在这里插入图片描述

  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • 需要适配的类(Adaptee):需要适配的类或适配者类。
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

类适配器

在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

  • 目标接口
/*** @author yuanhewei* @date 2024/2/18 17:44* @description*/
public interface Target {/*** 请求*/void request();
}
  • 具体实现类
/*** @author yuanhewei* @date 2024/2/18 18:00* @description*/
public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("类适配器-ConcreteTarget: 普通的实现类,具有普通的功能!");}
}
  • 适配者
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adaptee {public void specificRequest() {System.out.println("类适配器-Adaptee: 需要被适配器包装的具有特殊功能的类!");}
}
  • 适配器
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adapter extends Adaptee implements Target{@Overridepublic void request() {super.specificRequest();}
}
  • 测试代码
/*** @author yuanhewei* @date 2022-02-17 20:11*/
@SpringBootTest
class ClassAdapterTest {@Testvoid testClassAdapter() {Target adapter = new Adapter();adapter.request();Target concreteTarget = new ConcreteTarget();concreteTarget.request();}
}

对象适配器

在对象适配器模式中,适配器与适配者之间是关联关系。

  • 目标接口
/*** @author yuanhewei* @date 2024/2/18 17:44* @description*/
public interface Target {/*** 请求*/void request();
}
  • 具体实现类
/*** @author yuanhewei* @date 2024/2/18 18:00* @description*/
public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("类适配器-ConcreteTarget: 普通的实现类,具有普通的功能!");}
}
  • 适配者
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adaptee {public void specificRequest() {System.out.println("类适配器-Adaptee: 需要被适配器包装的具有特殊功能的类!");}
}
  • 适配器
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
@Service
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
  • 测试代码
/*** @author yunehewei* @date 2022-02-17 20:11*/
@SpringBootTest
class ObjectAdapterTest {@Testvoid testObjAdapter() {// 适配器Target adapter = new Adapter(new Adaptee());adapter.request();// 具体实现类Target concreteTarget = new ConcreteTarget();concreteTarget.request();}
}

从上面的代码可以看出,适配器必须有一个被适配的类的对象,然后通过Adapter适配器,把具有具体特殊的功能交给这个对象去实现。

在使用适配器模式时,可以使Adapter适配器通过传入的不同的Adaptee对象,实现多个不同的被适配的类的功能。当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。

参考

  • https://blog.csdn.net/lovelion/article/details/8624325
  • https://blog.csdn.net/a745233700/article/details/83628122

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

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

相关文章

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例:配置本地开发环境案例 Demo:配置本地 Solidity 环境案例代码:HelloWorld.sol 2.1.3 拓展案例 1:设置 Remix …

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动三方支付UIAbility)。 本章节将从如下场…

PDF合并工具

简单的PDF合并工具 简述 为了帮助同事做报销,就临时用 Python 使用 PDF 库打包了一个PDF文件合并工具,这个虽然对于很多程序员来说都是很简单的事情,但是对于一些不是很了解计算机技术的人确实是一个很尴尬的功能。 很多 PDF 编辑软件的这个…

《汇编语言》- 读书笔记 - 实验 10 编写子程序

《汇编语言》- 读书笔记 - 实验 10 编写子程序 1. 显示字符串问题子程序描述 show_str提示结果演示 2. 解决除法溢出的问题问题子程序描述 divdw提示结果演示 3. 数值显示问题子程序描述 dtoc提示结果演示 在这次实验中,我们将要编写3个子程序,通过它们来…

【MySQL】多表关系的基本学习

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【GO语言卵细胞级别教程】05.项目创建和函数讲解

感谢!点点赞和评论呀!我将继续更新 目录: 感谢!点点赞和评论呀!我将继续更新0.创建项目1.函数的引入2.注意事项3.详细介绍3.1 形参介绍 4.导入包4.1 基本知识4.2 注意事项 5.init函数6.匿名函数 0.创建项目 创建目录 …

以太坊 Dencun 升级与潜在机会

撰文:Biteye 核心贡献者 Fishery Isla 文章来源Techub News专栏作者,搜Tehub News下载查看更多Web3资讯。 以太坊网络升级 Dencun 测试网版本在 2024 年 1 月 17 日上线了 Goerli 测试网,1 月 30 日成功上线了 Sepolia 测试网,D…

拼夕夕 拼多多关键词恢复供应,欢迎骚扰

API接口(Application Programming Interface)是一种定义了软件组件之间交互的规范。它允许不同的软件系统之间进行通信和数据交换,使得开发者可以利用已有的功能和服务来构建自己的应用程序。 API接口可以分为不同的类型,包括Web…

[计算机网络]---UDP协议

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

题目链接:LCR 047. 二叉树剪枝 - 力扣(LeetCode) 题目: 一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中所有节点的值全都是 0 的子树。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的…

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding,本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下: BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…

集群聊天项目

不懂的一些东西 (const TcpConnectionPtr&)作为形参啥意思:接收一个常量引用,函数内部不允许修改该指针所指向的对象。 客户端与服务器如何联系? 优势 1.网络层与业务层分离:通过网络层传来的id,设计一个map存储id以及对印的业务处理器,处理器bind绑定处理函数,…

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author :susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…

基于java的企业校园招聘平台的设计与实现

分享一个自己的毕业设计,想要获取源码的同学加V:qq2056908377 链接:https://pan.baidu.com/s/1It0CnXUvc9KVr1kDcHWvEw 提取码:1234 摘要: 摘要:本毕业设计旨在设计和实现一个企业校园招聘平台&#xf…

MIT-BEVFusion系列九--CUDA-BEVFusion部署2 create_core之参数设置

目录 加载命令行参数main 函数中的 create_core图像归一化参数体素化参数稀疏卷积网络参数真实世界几何空间参数 (雷达坐标系下体素网格的参数)解码后边界框的参数构建 bevfusion::Core 存储推理时需要的参数 本章开始,我们将一起看CUDA-BEVFusion的代码流程&#x…

微信小程序view设置margin-top和margin-button无效的解决方案

微信小程序view设置margin-top和margin-button无效的解决方案 问题发现解决过程解决问题正确办法综上所述,position、overflow、border属性都可以解决这个问题 制作不易,感谢三联,谢谢大家了 问题发现 当我新建一个微信小程序项目时&#xf…

适配器模式:接口转换的艺术,让不匹配成为过去式

适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。在Java中,适配器模式可以通过实现一个适配器类来实现两个不兼容接口之间的转…

Android Studio安装SDK失败解决办法

Android Studio安装SDK失败解决办法 安装SDK时界面会显示安装的连接,同时在你选择的安装SDK的文件夹里面会生成一些目录和文件,在你选择放SDK的目录下有一个叫做.temp的文件夹,里面放的就是下载的临时文件。 .temp内部的文件夹里面能看到下…

平时积累的FPGA知识点(7)

平时在FPGA群聊等积累的FPGA知识点,第七期: 11 描述扇出的xilinx官方文档是? 解释:ug949 12 在BD中如何指定某个IP用global,其他的用OOC模式?因为某个模块引用的IP带着XPM,综合不了 解释&am…

DS:栈和队列的相互实现

创作不易,感谢友友们三连!! 一、前言 栈和队列的相互实现是用两个栈去实现队列或者是用两个队列去实现栈,这样其实是把问题复杂化的,实际中没有什么应用价值,但是通过他们的相互实现可以让我们更加深入地理…
推荐文章