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

文章目录

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

介绍

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

  Adapter模式有以下两种。

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

开始

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

架构图

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

定义被适配者

public interface AdvancedMediaPlayer {

    /**
     * 播放视频
     *
     * @param fileName
     */
    void specificPlay(String fileName);


}

@Service
public class MP4Player implements AdvancedMediaPlayer {
    @Override
    public void specificPlay(String fileName) {
        System.out.println("播放 mp4 格式的媒体 , 文件名 : " + fileName);
    }
}

@Service
public class WmvPlayer implements AdvancedMediaPlayer {

    @Override
    public 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 {

    @Resource
    private Map<String, AdvancedMediaPlayer> advancedMediaPlayerMap;

    @Override
    public 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 {
    @Override
    public void specificRecharger() {
        System.out.println("完成 lightning 接口的充电");
    }
}

@Service
public class TypeCAdaptee implements RechargerAdaptee {
    @Override
    public 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 {

    @Override
    public void lightningRecharger() {
        System.out.println("---------------lightning 转 type C 接口~适配器开始工作-------------------");
        super.specificRecharger();
    }

}
@Service
public class TypeCAdapter extends LightningAdaptee implements TypeCConnector {

    @Override
    public void typeCRecharger() {
        System.out.println("---------------type C 转 lightning 接口~适配器开始工作-------------------");
        super.specificRecharger();
    }

}

测试样例

@Slf4j
@SpringBootTest(classes = AdapterApplication.class)
public class TestAdapter {

    @Resource
    private LightningAdapter lightningAdapter;

    @Resource
    private TypeCAdapter typeCAdapter;

    @Resource
    private MediaAdapter mediaAdapter;

    @Test
    public void testRechargerAdapter() {
        lightningAdapter.lightningRecharger();
        System.out.println("----------------------------------");
        typeCAdapter.typeCRecharger();
    }

    @Test
    public 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中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4,八种GPIO模式

资料来源:【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 仅作个人自学笔记&#xff0c;如有冒犯&#xf…

版本匹配指南:PyTorch版本、Python版本和pytorch_lightning版本的对应关系

版本匹配指南&#xff1a;PyTorch版本、Python版本和pytorch_lightning版本的对应关系 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a; 我是高斯…

《征服数据结构》双向链表

摘要&#xff1a; 1&#xff0c;双链表的介绍 2&#xff0c;双链表的用途 3&#xff0c;双链表的节点插入和删除 1&#xff0c;双链表的介绍 前面我们讲过单链表&#xff0c;单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多&#xff0c;比如删除倒数第…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

Web组态可视化编辑器 快速绘制组态图

演示地址&#xff1a;by组态[web组态插件] 随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于…

Ps 滤镜:消失点

Ps菜单&#xff1a;滤镜/消失点 Filter/Vanishing Point 快捷键&#xff1a;Ctrl Alt V 两条平行的铁轨或两排树木连线相交于很远很远的某一点&#xff0c;这点在透视图中叫做“消失点”&#xff0c;也称为“灭点”。 消失点 Vanishing Point滤镜主要用于在图像中处理具有透视…

NSS题目练习4

[LitCTF 2023]1zjs 打开后是一个游戏&#xff0c;用dirsearch扫描&#xff0c;什么都没发现 查看源代码搜索flag&#xff0c;发现没有什么用 搜索php&#xff0c;访问 出现一堆符号&#xff0c;看样子像是jother编码 解码得到flag&#xff0c;要删掉[] [LitCTF 2023]Http pro …

【StableDiffusion】SD1.4、1.5、2.0、2.1 和 SDXL0.9-1.0、SDXL turbo 等的区别

总览 1.基础sd base model家族&#xff1a;SD1.4、SD1.5、SD1.5-LCM、SD2.0、SD2.0-768、SD2.1、SD2.1-768、SD2.1-UNCLIP 2.升级sdxl base model家族&#xff1a;SDXL0.9、SDXL1.0、SDXL1.0-LCM、SDXL-DISTILLED、SDXL-TURBO 3.专门用于视频生成的 SVD 家族&#xff1a;SVD、…

备战秋招c++ 【持续更新】

T1 牛牛的快递 原题链接&#xff1a;牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型&#xff1a;模拟 审题&确定思路&#xff1a; 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹&#xff0c;学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间&#xff0c;YOLOv10就来了&#xff01; 《太卷了&#xff0c;目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

城市空气质量数据爬取分析可视化

城市空气质量数据爬取分析可视化 一、效果展示二、完整代码2.1 数据爬取代码2.2 数据分析代码一、效果展示 先来看一下数据情况以及可视化效果,本项目使用了pyecharts绘制了日历图、雷达图、折线图、柱状图、饼图和平行坐标系。完整代码附后: 数据如下: 日历图: 饼图: …

拿捏数据结构-top_k问题

top_k问题时间复杂度的计算 这里提前说明&#xff0c;时间复杂度的计算的目的是来计算向上调整的更优还是向下调整更优&#xff0c;从肉眼看的话向下调整优于向上调整&#xff0c;接下来我们进行时间复杂度的计算。 此时我们会用到等比数列求和以及裂项相消 如图 首先我们假设求…

Github Actions/workflow的使用

背景 Github提供了免费的Actions执行workflows工作流&#xff0c;在CI/CD场景下可用于跑测试用例、构建、打包、部署/发版等操作。 使用介绍 工作流简介 1个project可以配置多个workflow&#xff0c;每个workflow使用一个yaml文件配置&#xff1b;单个workflow可以配置多个…

身份认证页面该怎么设计更加合理?

一、认证页面的作用 认证页面在应用程序中具有以下几个重要的作用&#xff1a; 验证用户身份&#xff1a;认证页面的主要作用是验证用户的身份。通过要求用户提供正确的凭据&#xff08;如用户名和密码、生物特征、验证码等&#xff09;&#xff0c;认证页面可以确认用户是合法…

使用华为快传同步文件至电脑

使用华为快传同步文件至电脑&#xff0c;电脑端未发现设备解决办法 1、手机和电脑连同一网络 2、打开手机华为分享&#xff0c;打开电脑网络 3、网络中找到设备&#xff0c;输入账户密码进行连接&#xff08;未找到设备往下继续看&#xff09; 未找到设备解决办法&#xff1…

图解 Transformer

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

拿捏数据结构- 链式二叉树

链式二叉树的概念&#xff1a; 链式二叉树解决的是非完全二叉树解决不了的问题 什么意思呢&#xff0c;简单的说就是&#xff0c;链式二叉树 可以是下面三种二叉树 但是非链式二叉树只能是前两种 链式二叉树的存储 节点结构&#xff1a;首先定义一个结构体或类来表示二叉树的节…

Java跨Docker容器备份数据库数据

Java跨Docker容器备份数据库数据 前置背景思路整理编写备份脚本容器启动检验效果Java容器MySQL容器 Java代码执行备份 我的个人博客&#xff1a;Lichg&#xff0c;欢迎大家访问。 前置背景 在我们的开发部署场景中&#xff0c;通常多数使用Docker进行部署。当你的数据库和项目…

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java | Leetcode Java题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int numDistinct(String s, String t) {int m s.length(), n t.length();if (m < n) {return 0;}int[][] dp new int[m 1][n 1];for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0; …