java设计模式(七)适配器模式(Adapter Pattern)

1、模式介绍:

        适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。

2、应用场景:

         系统需要使用现有的类,而这些类的接口不符合需求。
        不想修改现有的接口,而又需要复用该接口的情况。
        多个类似功能的接口需要统一。

3、优点:

        增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
        灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。

4、缺点:

        过多使用适配器,会让系统非常零乱。
        增加系统的复杂性
:因为增加了额外的适配器,可能会增加系统的理解难度

5、代码实现:

/*** 适配接口** @author FM_南风* @date 2024/6/27 13:53*/
public interface MediaPlayer {void play(String mediaType, String fileName);
}/*** 被适配者** @author FM_南风* @date 2024/6/27 13:54*/
public class AudioPlayer implements MediaPlayer{@Overridepublic void play(String mediaType, String fileName) {if (mediaType.equalsIgnoreCase("mp3")) {System.out.println("播放MP3文件: " + fileName);} else {System.out.println("使用" + mediaType + "媒体播放");}}
}/*** 新适配接口** @author FM_南风* @date 2024/6/27 13:55*/
public interface AdvancedMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}/*** Mp4播放器实现新的接口** @author FM_南风* @date 2024/6/27 13:56*/
public class Mp4Player implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {}@Overridepublic void playMp4(String fileName) {System.out.println("播放MP4文件: " + fileName);}
}/*** Vlc播放器实现新的接口** @author FM_南风* @date 2024/6/27 13:56*/
public class VlcPlayer implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("播放Vlc文件: " + fileName);}@Overridepublic void playMp4(String fileName) {}
}/*** 适配器类,实现目标接口并持有被适配者的引用** @author FM_南风* @date 2024/6/27 13:57*/
public class MediaAdapter implements MediaPlayer{AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String mediaType) {if (mediaType.equalsIgnoreCase("vlc")) {advancedMusicPlayer = new VlcPlayer();} else if (mediaType.equalsIgnoreCase("mp4")) {advancedMusicPlayer = new Mp4Player();}}@Overridepublic void play(String mediaType, String fileName) {if (mediaType.equalsIgnoreCase("vlc")) {advancedMusicPlayer.playVlc(fileName);} else if (mediaType.equalsIgnoreCase("mp4")) {advancedMusicPlayer.playMp4(fileName);}}
}/*** 应用** @author FM_南风* @date 2024/6/27 13:58*/
public class AdapterClient {public static void main(String[] args) {MediaPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "音乐.mp3");audioPlayer.play("mp4", "视频.mp4");audioPlayer.play("vlc", "视频.vlc");audioPlayer.play("avi", "视频.avi"); // Unsupported media type}
}

6、结果展示:

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

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

相关文章

【深度学习】注意力机制

https://blog.csdn.net/weixin_43334693/article/details/130189238 https://blog.csdn.net/weixin_47936614/article/details/130466448 https://blog.csdn.net/qq_51320133/article/details/138305880 注意力机制:在处理信息的时候,会将注意力放在需要…

gitee项目上不同的项目分别使用不用的用户上传

最近使用根据需要,希望不同的项目使用不同的用户上传,让不同的仓库展示不同的用户名!!! 第一步查看全局的用户信息: # 查看目前全局git配置信息 git config -l #会输出全局的git配置信息 第二步进入到要设…

大科技公司大量裁员背后的真相

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

冒泡排序、选择排序、菱形

冒泡排序、选择排序、菱形 文章目录 一、冒泡排序二、选择排序三、菱形 一、冒泡排序 思路: 外层(第一层)循环控制循环次数,和业务无关 内层(第二层)循环用于比较相邻的2个值的大小,根据小到大…

B站、小红书“崩”了!阿里云紧急回应

7月2日,“B站崩了”“小红书崩了”冲上微博热搜!据悉,“崩了”的原因是阿里云上海服务出现异常。 B站App无法使用浏览历史关注等内容,消息界面、更新界面、客服界面均不可用,用户也无法评论和发弹幕,视频评…

鸿蒙开发设备管理:【@ohos.multimodalInput.touchEvent (触摸输入事件)】

触摸输入事件 设备上报的触屏事件。 说明: 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import {Action,ToolType,SourceType,Touch,TouchEvent} from ohos.multimodalInput.touchEvent;…

2024年江西省研究生数学建模竞赛A题交通信号灯管理论文和代码分析

经过不懈的努力,2024年江西省研究生数学建模竞赛A题论文和代码已完成,代码为A题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模…

养猫家庭如何正确除猫毛?希喂、范罗士、米家浮毛空气净化器分享

作为一名6年资深铲屎官,我发现养猫已经成为年轻人的潮流,很多铲屎官跟风养了猫咪。但是她们并不知道撸猫虽然很快乐,但是猫咪的体味和猫浮毛也会让人很头疼。特别是宠物排泄物的气味,经常搞卫生很多人接受不了。这样导致很多人养一…

贪心算法算法,完全零基础小白教程,不是计算机的都能学会!超详解

目录 一、基本概念 二、举几个例子,便于理解 1、找零问题 2、最小路径和 3、背包问题 1)只考虑体积的贪心策略: 2) 只考虑价值的贪心策略: 三、贪心策略的特点 四、贪心策略证明 四、如何学习贪心 五、例题…

助力构建新型电力系统自主可控实时底座

近日,2024亚洲新型电力系统及储能展览会&亚洲新型电力及储能论坛会在广州广交会展馆圆满落下帷幕!科东软件携多款电力产品亮相展会,并在2024亚洲新型电力及储能论坛发表《“鸿道Intewell操作系统助力构建新型电力系统自主可控实时底座”》的主…

ArcTs布局入门03——层叠布局(Stack)

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧! 扫描下面的二维码关注公众号。 1、概述 叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实…

终身免费的Navicat数据库,不需要破解,官方支持

终身免费的Navicat数据库,不需要破解,官方支持 卸载了Navicat,很不爽上干货,Navicat免费版下载地址 卸载了Navicat,很不爽 公司不让用那些破解的数据库软件,之前一直使用Navicat。换了几款其他的数据库试了…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像 2024/7/2 18:19 rootok3588:/# rootok3588:/# rootok3588:/# lsusb Bus 005 Device 001: ID 1d6b:0002 Bus 003 Device 001: ID 1d6b:0001 Bus 001 Device 001: ID 1d6b:0002 Bus 006 Device 00…

将excel表格转换为element table(上)

最近有个功能需要将excel展示到html 界面里面,看是简单的一个需求也是需要费尽心思才完得成 原始数据 想要把excel 读取出来,于是使用xlsl的插件 npm i xlsx通过插件可以获取到已经分析好的数据 然后使用sheet_to_html将数据转换为html 再使用v-htm…

Xorbits inference操作实战

1.操作环境 序号软件版本备注1Windows1.版本:Windows 10 专业版2.版本号:21H23.操作系统内部版本:19044.18892Docker Desktop4.24.2 (124339)3WSLUbuntu 22.04 LTS4Python3.105CUDA12.16Dify0.6.6 Xorbits inference 是一个强大且通用的分布…

day09了 加油

浅拷贝 指向同一个地址空间 右边不可取地址 左边一定是到了具体的位置 右值引用std&#xff1a;&#xff1a; move 相信大家默认构造函数都没有问题&#xff0c;所以就不贴例子了 浅拷贝构造函数 只负责复制地址&#xff0c;而不是真的把完整的内存给它 #include <iostre…

shell 脚本编程

简介&#xff1a;用户通过shell向计算机发送指令的&#xff0c;计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果&#xff1a;提高工作效率、可以实现自动化 需要学习的内容&#xff1a;Linux 、 shell的语法规范 编写shell的流程&#xff1a; 第一步…

数据库系统体系结构-DBMS的三级模式结构、DBMS的工作方式、模式定义语言、二级映射

一、体系结构的概念 1、大多数DBMS遵循三级模式结构 &#xff08;1&#xff09;外模式 &#xff08;2&#xff09;概念模式 &#xff08;3&#xff09;内模式 2、DBMS的体系结构描述的应该是系统的组成结构及其联系以及系统结构的设计和变化的原则等 3、1978年美国国家标…

Java学习 (七) 面向对象--多态、object类

一、多态性 多态在java中的体现是 父类的引用指向子类的对象 格式&#xff1a; 父类类型 变量名 子类对象 1、代码案例 vi Person.java public class Person {public String name;public int age;//新增方法public void eat(){System.out.println("人吃饭");}…