基于SpringBoot设计模式之结构型设计模式·适配器模式

文章目录

  • 介绍
  • 开始
    • 使用委托的适配器(媒体播放器)
      • 架构图
      • 定义被适配者
      • 定义需求接口
      • 定义适配者
    • 使用继承的适配器(手机充电接口)
      • 架构图
      • 定义被适配者
      • 定义需求接口
      • 定义适配者
    • 测试样例
  • 总结
    • 优点
    • 缺点

介绍

  在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”“所需的程序”之间差异的设计模式就是Adapter模式
Adapter模式也被称为 Wrapper模式。Wrapper有“包装器”的意思,就像用精美的包装纸将普通商品包装成礼物那样,替我们把某样东西包起来,使其能够用于其他用途的东西就被称为“包装器”或是“适配器”

  Adapter模式有以下两种。

  • 对象适配器模式(使用委托的适配器)
  • 类适配器模式(使用继承的适配器)

开始

使用委托的适配器(媒体播放器)

架构图

使用委托的适配器(媒体播放器)

定义被适配者

public interface AdvancedMediaPlayer {/*** 播放视频** @param fileName*/void specificPlay(String fileName);}
@Service
public class MP4Player implements AdvancedMediaPlayer {@Overridepublic void specificPlay(String fileName) {System.out.println("播放 mp4 格式的媒体 , 文件名 : " + fileName);}
}
@Service
public class WmvPlayer implements AdvancedMediaPlayer {@Overridepublic void specificPlay(String fileName) {System.out.println("播放 wmv 格式的媒体 , 文件名 : " + fileName);}}

定义需求接口

public interface MediaPlayer {/*** 播放媒体,这里由于有很多的媒体类型,通过type解决 类型不同。* 因此,这里衍生可以加上工厂解决这个type问题** @param audioType* @param fileName*/void play(String audioType, String fileName);
}

定义适配者

@Service
public class MediaAdapter implements MediaPlayer {@Resourceprivate Map<String, AdvancedMediaPlayer> advancedMediaPlayerMap;@Overridepublic void play(String audioType, String fileName) {AdvancedMediaPlayer advancedMediaPlayer = advancedMediaPlayerMap.get(audioType);if (Objects.isNull(advancedMediaPlayer)) {System.out.println("当前类型暂不支持,无法播放~~~~~");} else {advancedMediaPlayer.specificPlay(fileName);}}}

使用继承的适配器(手机充电接口)

架构图

使用继承的适配器(手机充电接口)

定义被适配者

public interface RechargerAdaptee {void specificRecharger();
}
@Service
public class LightningAdaptee implements RechargerAdaptee {@Overridepublic void specificRecharger() {System.out.println("完成 lightning 接口的充电");}
}
@Service
public class TypeCAdaptee implements RechargerAdaptee {@Overridepublic void specificRecharger() {System.out.println("完成 type C 接口的充电");}
}

定义需求接口

public interface LightningConnector {void lightningRecharger();
}
public interface TypeCConnector {void typeCRecharger();
}

定义适配者

@Service
public class LightningAdapter extends TypeCAdaptee implements LightningConnector {@Overridepublic void lightningRecharger() {System.out.println("---------------lightning 转 type C 接口~适配器开始工作-------------------");super.specificRecharger();}}
@Service
public class TypeCAdapter extends LightningAdaptee implements TypeCConnector {@Overridepublic void typeCRecharger() {System.out.println("---------------type C 转 lightning 接口~适配器开始工作-------------------");super.specificRecharger();}}

测试样例

@Slf4j
@SpringBootTest(classes = AdapterApplication.class)
public class TestAdapter {@Resourceprivate LightningAdapter lightningAdapter;@Resourceprivate TypeCAdapter typeCAdapter;@Resourceprivate MediaAdapter mediaAdapter;@Testpublic void testRechargerAdapter() {lightningAdapter.lightningRecharger();System.out.println("----------------------------------");typeCAdapter.typeCRecharger();}@Testpublic void testMediaAdapter() {mediaAdapter.play("MP4Player","1.MP4");mediaAdapter.play("wmvPlayer","2.wmv");mediaAdapter.play("swfPlayer","3.swf");}}

总结

  将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

优点

  1. 促进了类之间的协同工作,即使它们没有直接的关联。
  2. 提高了类的复用性。
  3. 增加了类的透明度。
  4. 提供了良好的灵活性。

缺点

  1. 过度使用适配器可能导致系统结构混乱,难以理解和维护。
  2. 在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。

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

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

相关文章

Linux shell编程学习笔记50:who命令

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。比如&#xff0c;我们可以使用who命令来收集当前已登陆系统的用户信息&#xff0c;当前运行级别等信息。 1. who命令 的功能、格式和选项…

对未知程序所创建的带有折叠书签的 PDF 文件书签层级全展开导致丢失的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级&#xff0c;提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6&#xff0c;先提取后回挂 2、PdgCntEditor 载入后&#xff0c;直接保存…

JVM(内存区域划分、类加载机制、垃圾回收机制)

目录 一. 内存区域划分 1.本地方法栈(Native Method Stacks) 2.虚拟机栈(JVM Stacks) 3.程序计数器(Program Counter Register) 4.堆(Heap) 5.元数据区(Metaspace) 二.类加载机制 1.加载 2.验证 3.准备 4.解析 5.初始化 "双亲委派模型" 三. GC 垃圾回收…

基于OrangePi AIpro的后端服务器构建

一. OrangePi AIpro简介 1.1 OrangePi AIpro外观 1.2 OrangePi AIpro配置 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB…

CLI举例:负载分担场景下的源NAT配置(主备设备共用同一个地址池)

CLI举例&#xff1a;负载分担场景下的源NAT配置&#xff08;主备设备共用同一个地址池&#xff09; 组网需求 如图1所示&#xff0c;企业的两台FW的业务接口都工作在三层&#xff0c;上下行分别连接路由器。FW与上下行路由器之间运行OSPF协议。上行接口连接同一个ISP。 现在希…

md是什么?如何打开md类型的文件?假如使用Typora打开,如何免费激活Typora?

md是什么&#xff1f;如何打开md类型的文件 前言一、md是什么简介常见打开md类型文件的方法使用文本编辑器使用专用Markdown编辑器使用在线Markdown编辑器在浏览器中安装插件打开 二、下载安装Typora三、免费激活Typora激活Typora关闭软件每次启动时的已激活弹窗去除软件左下角…

微信资源混淆,导致的约束布局 Constraintlayout 控件重叠!

问题 1、广告六要素 虽然我不参与广告 sdk 接入等相关工作&#xff0c;但是最近总是听到一个词广告六要素。这到底是什么&#xff1f; 国内下载类广告&#xff0c;尤其是针对移动应用推广的广告&#xff0c;其成功实施往往围绕几个关键要素进行&#xff0c;这些要素能够帮助…

Java之Writer类:探索Java中的输出流

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

北京邮电大学人工智能考数据结构,均分370!北京邮电大学计算机考研考情分析!

北京邮电大学&#xff08;Beijing University of Posts and Telecommunications&#xff09;&#xff0c;简称北邮&#xff0c;是中华人民共和国教育部直属、工业和信息化部共建的全国重点大学&#xff0c;位列国家“211工程”、“985工程优势学科创新平台”、“世界一流学科建…

FreeBSD下使用原生虚拟机管理器bhyve

hbyve简介 自 FreeBSD 10.0-RELEASE 起&#xff0c;BSD 许可的 bhyve 虚拟机管理器已成为底层系统不可或缺的一部分。bhyve 强大而灵活&#xff0c;支持多种客户机操作系统&#xff0c;涵盖 FreeBSD、OpenBSD 以及多个 Linux 发行版。在默认配置下&#xff0c;bhyve 提供对串行…

Android 14 - 绘制体系 - 概览

从Android 12开始&#xff0c;Android的绘制系统有结构性变化&#xff0c; 在绘制的生产消费者模式中&#xff0c;新增BLASTBufferQueue&#xff0c;客户端进程自行进行queue的生产和消费&#xff0c;随后通过Transation提交到SurfaceFlinger&#xff0c;如此可以使得各进程将缓…

2024年上半年系统架构设计师——案例第四题——智能汽车相关

写在前面 趁着还记得请&#xff0c;留个纪念。MongoDB的概念完全没记&#xff0c;综合下来只好选这个了。 这题基本上是有自动驾驶背景知识的人的福音&#xff0c;也是第一次考的和现代热点前沿技术相关的内容&#xff0c;而不是考些老嵌入式架构的&#xff08;上一次看到的还…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…

APM2.8用USB在线下载固件

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口&#xff0c;不要选择auto&#xff0c;如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意&#xff1a;烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

QT C++ 模型视图结构 QTableView 简单例子

在Qt中&#xff0c;MVC模式被广泛使用于各种用户界面框架中&#xff0c;包括Qt的模型视图结构。Qt的模型视图结构是基于MVC模式设计的&#xff0c;其中包括了Model、View和Delegate三个部分。 QTableView是Qt模型视图结构中的一种视图&#xff0c;它用于以表格形式显示数据。 …

【No More Room in Hell】地狱已满服务器一键开服多人联机教程

1、购买后登录服务器 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、连接游戏 2.1、安装完成后复制开机下方的IP地址 2.2、打开Steam点击左上角的查看➡服务器 点击收藏➡右下角号 粘贴地址…

解决npm卡死,无法安装依赖

npm卡死&#xff0c;无法安装依赖 异常描述原因分析与解决方法 异常描述 1.无法进入命令行&#xff0c;或是很慢没反应 2.装表格无限滚动的el-table-infinite-scroll依赖一上午了&#xff0c;也不能装&#xff0c;报错提示 原因分析与解决方法 1.命令行的问题&#xff1a;缓…

RabbitMQ 之 死信队列

目录 ​编辑一、死信的概念 二、死信的来源 三、死信实战 1、代码架构图 2、消息 TTL 过期 &#xff08;1&#xff09;消费者 &#xff08;2&#xff09;生产者 &#xff08;3&#xff09;结果展示​编辑 3、队列达到最大长度 &#xff08;1&#xff09;消费者 &…

3DF Zephyr v7 解锁版安装教程 (照片转三维模型软件)

前言 3DF Zephyr是一款照片转三维模型软件&#xff0c;可以导出许多常见的3D格式&#xff0c;甚至无需外部工具即可生成无损视频。此外&#xff0c;可以生成真正的正射影像&#xff0c;数字高程模型&#xff08;DTM&#xff09;&#xff0c;甚至可以计算面积&#xff0c;体积&…

软件技术架构全面详解

软件架构全面详解 软件架构 这个与建筑设计架构类似,建筑设计架构师负责设计建筑物的整体结构、布局和功能分配。 而软件架构师,负责设计软件系统的整体组织结构、模块划分、和功能分配。 两者都需要考虑到业务功能、性能、可扩展性、安全性、以及用户体验等方面。 软件架…