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

news2024/12/22 19:45:21

文章目录

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

介绍

  在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”“所需的程序”之间差异的设计模式就是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中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。

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

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

相关文章

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

题目&#xff1a; 题解&#xff1a; class Solution:def numDistinct(self, s: str, t: str) -> int:m, n len(s), len(t)if m < n:return 0dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][n] 1for i in range(m - 1, -1, -1):for j in range(n …

词法与语法分析器介绍

概述 词法和语法可以使用正则表达式和BNF范式表达&#xff0c;而最终描述文法含义的事状态转换图 Lex与YACC 词法分析器Lex 词法分析词Lex&#xff0c;是一种生成词法分析的工具&#xff0c;描述器是识别文本中词汇模式的程序&#xff0c;这些词汇模式是在特殊的句子结构中…

再见PS,Canva Create正式上线

再见&#xff0c;Photoshop&#xff01; Canva Create 正式上线&#xff0c;太疯狂了&#xff01;&#xff01; Canva是一款著名的免费在线AI图像生成器 构想你的创意&#xff0c;然后将其添加到你的设计中。使用最佳的AI图像生成器&#xff0c;观察你的文字和短语变换成美丽…

探索Java的DNA-JVM字节码深度解析

引言 在Java的世界里&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是我们程序运行的心脏。而字节码&#xff0c;作为JVM的血液&#xff0c;携带着程序的执行指令。今天&#xff0c;我们将深入探索Java字节码的奥秘&#xff0c;一窥JVM如何将人类可读的代码转化为机器可执…

【香橙派AIpro】开箱测评

1.板子开箱 哟&#xff0c;看起来还不错哦&#xff01;&#xff01;&#xff01; 收货清单&#xff1a; 主板*1 1.5m数据线*1 充电头*1 1.1.充电头 近65W的充电头&#xff0c;不错不错。 1.2.主板 1.2.1.上面 哇噢&#xff0c;还送了2.4/5G的WiFi和蓝牙天线。 emm&#xf…

【NumPy】关于numpy.argsort()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

计算机专业必考之计算机指令设计格式

计算机指令设计格式 例题&#xff1a; 1.设相对寻址的转移指令占3个字节&#xff0c;第一字节为操作码&#xff0c;第二&#xff0c;第三字节为相对偏移量&#xff0c; 数据在存储器以低地址为字地址的存放方式。 每当CPU从存储器取出一个字节时候&#xff0c;自动完成&…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

【Linux-LCD 驱动】

Linux-LCD 驱动 ■ Framebuffer 简称 fb■ LCD 驱动程序编写■ 1、LCD 屏幕 IO 配置■ 2、LCD 屏幕参数节点信息修改■ 3、LCD 屏幕背光节点信息■ 4、使能 Linux logo 显示 ■ 设置 LCD 作为终端控制台■ 1、设置 uboot 中的 bootargs■ 2、修改/etc/inittab 文件 ■ LCD 背光…

亚马逊高效广告打法及数据优化,亚马逊高阶广告打法课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89342733 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 001.1-亚马逊的广告漏斗和A9算法的升级变化.mp4 002.2-流量入口解析和广告的曝光机制.mp4 003.3-标签理论 .mp4 004.4-不同广告类…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

预热 618,编程好书推荐——提升你的代码力

文章目录 &#x1f4cb;前言&#x1f3af;编程好书推荐&#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智…

SolidWorks教育版 学生使用的优势

在工程技术领域的学习中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;如SolidWorks已经成为学生掌握专业知识和技能的必要工具。SolidWorks教育版作为专为教育机构和学生设计的版本&#xff0c;不仅提供了与商业版相同的强大功能&#xff0c;还为学生带来了诸多独…

传输层安全性 (TLS)

传输层安全 (TLS) 旨在提供传输层的安全性。TLS 源自称为安全套接字层 (SSL)的安全协议。 TLS 确保任何第三方都无法窃听或篡改任何消息。 TLS 有几个好处&#xff1a; ● 加密&#xff1a; TLS/SSL 可以帮助使用加密来保护传输的数据。 ● 互操作性&#xff1a; TLS/S…

利用audacity和ffmpeg制作测试音频文件

最近要用SIPP测试一个场景&#xff0c;需要发送双声道/16K采样率/16bit量化的PCM流&#xff0c;但是下载的素材往往不能满足参数要求。那么就自己制作。 首先下载mp3文件&#xff0c;并用audacity打开。 接下来&#xff0c;点击菜单栏中轨道-重采样&#xff0c;将采样频率设为1…

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

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

运维笔记.Docker镜像分层原理

运维专题 Docker镜像原理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/artic…

陈丽:人工智能赋能教育创新发展

5月20日&#xff0c;在顾明远先生莅临科大讯飞考察指导高端咨询会暨“人工智能与未来教育”的主题研讨会上&#xff0c;北京师范大学原副校长、中国教育技术协会副会长陈丽教授作了题为《人工智能赋能教育创新发展》的主旨报告。 &#xff08;以下内容根据陈丽教授在研讨会上的…

Python | Leetcode Python题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; class Solution:def connect(self, root: Node) -> Node:if not root:return root# 从根节点开始leftmost rootwhile leftmost.left:# 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next 指针head leftmostwhile head:#…

C++习题(1)

一、题目描述&#xff1a; 二、代码展示&#xff1a; #include <iostream> #include <iomanip> using namespace std; struct Student{char name[20];int id;int age;float score; }; int main() {int n;cin>>n;Student student[n];float sum0.0;for(int i0…