基于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,一经查实,立即删除!

相关文章

Flutter 中的 Center 小部件:全面指南

Flutter 中的 Center 小部件&#xff1a;全面指南 在Flutter的世界里&#xff0c;Center是一个简单而强大的布局小部件&#xff0c;它能够将子组件放置在父组件的中心位置。无论是水平中心、垂直中心&#xff0c;还是两者都居中&#xff0c;Center都能轻松实现。本文将详细介绍…

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;直接保存…

异常(Java.lang.Throwable)

说明&#xff1a;代表程序出现的问题。 异常的体系&#xff1a; &#xff08;一&#xff09;Error 说明&#xff1a;代表的系统级别错误(属于严重问题)&#xff0c;也就是说系统一旦出现问题&#xff0c;sun公司会把这些问题封装成Error对象给出来&#xff0c;Error是给sun公…

本地缓存之Guava Cache

概述 缓存的目的就是减少数据库DB端负载提高访问速度,最终提升系统性能缓存种类 分布式缓存&#xff1a; Redis、Memcached本地/进程缓存(JVM中堆内存)&#xff1a;Ehcache、Guava Cache、Caffeine Guava Guava是Google开源的Java类库,提供了一组核心库&#xff0c;目的是帮助…

已解决java.lang.ExceptionInInitializerError: 初始化程序中的异常错误的正确解决方法,亲测有效!!!

已解决java.lang.ExceptionInInitializerError: 初始化程序中的异常错误的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 分析错误栈信息 检查静态初始化块和静态变量 验证资源和配置 使用日志记录…

统计建模选题推荐

统计建模选题推荐 统计建模作为数据分析领域的重要工具&#xff0c;其在多个领域中都有着广泛的应用。选择一个合适的统计建模选题对于研究者而言至关重要&#xff0c;它不仅能够展示研究者的专业素养和技能水平&#xff0c;还能够为实际问题的解决提供有力的支持。以下是一些…

Python 应用打包成 APK【全流程】

将 Python 应用打包成 APK。 文章目录 步骤 1: 安装 Buildozer 和其依赖Linux (Ubuntu) 环境下安装: 步骤 2: 创建你的 Python 应用步骤 3: 配置 Buildozer步骤 4: 打包成 APK总结 步骤 1: 安装 Buildozer 和其依赖 首先确保你的系统中已安装 Python 和 pip。接下来&#xff…

C-数据结构-平横二叉树

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是一种二叉树&#xff0c;其中任意节点的两棵子树的高度差不超过 1。也可以说是一棵空树或者左右子树高度差不超过 1 的二叉树。 特点和性质 高度平衡&#xff1a;平衡二叉树是一种高度平衡的二叉树&#xff0c;任意节…

教育学口诀解析

1) 卢梭爱自然&#xff0c;爱是《爱弥儿》&#xff0c;自然就是自然主义教育。夸美纽斯是教育遵循自然。 夸大自然拌饭&#xff0c;和 卢梭爱自然 2&#xff09; 陶行知的教育思想——两S一教&#xff0c;S是社会和生活首字的第一个字母。 陶行知的教育思想是结合了当时中国…

【量算分析工具-坡度】GeoServer改造Springboot番外系列七

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

字符串表达式可被解析包含加减乘除取模和次幂运算的数学表达式

实现一个简单的表达式求值器&#xff0c;可以解析包含加减乘除取模和次幂运算的数学表达式&#xff0c;并计算出最终结果。通过递归解析表达式中的数字和运算符&#xff0c;并按照运算符的优先级进行计算&#xff0c;最终输出表达式的计算结果。 #include <stdio.h> #in…

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

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

小红书引流需要注意哪些问题

小红书引流需要注意以下几个问题&#xff1a; 1. 内容质量&#xff1a;确保发布的内容高质量、有吸引力&#xff0c;能够引起用户的兴趣和共鸣。 2. 遵守规则&#xff1a;了解并遵守小红书的社区规则和相关法律法规&#xff0c;避免违规行为。 3. 定位明确&#xff1a;明确自…

【MySQL精通之路】全文搜索(5)-限制

主博客&#xff1a;【MySQL精通之路】全文搜索功能-CSDN博客 全文搜索仅支持InnoDB和MyISAM表。 分区表不支持全文搜索。参见“分区的限制和限制”。 全文搜索可用于大多数多字节字符集。 例外的是&#xff0c;对于Unicode&#xff0c;可以使用utf8mb3或utf8mb4字符集&#xff…

基于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。 现在希…

【软件设计师】——12.法律法规与标准化

保护范围与对象 法律法规名称保护对象及范围注意事项著作权法/版权文学、绘画、摄影等作品不需要申请&#xff0c;作品完成即开始保护&#xff1b;绘画摄影作品原件出售/赠予著作权还归原作者&#xff1b;原件拥有者具有所有权、展览权软件著作权法、计算机软件保护条例软件著作…

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

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

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

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