【Java设计模式】四、适配器模式

文章目录

  • 1、适配器模式
  • 2、举例

1、适配器模式

  • 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁
  • 目的是将一个类的接口转换成客户希望的另外一个接口
  • 适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

最后,适配器是对已经开发完的系统的一种改造思路,新设计尽量一次设计好,或者时间充裕就重构。适配器太多会使得系统很乱,看着在调A接口,底下已被适配到了B接口。

2、举例

背景:有两个接口,分别为媒体播放器(播放音频)、高级媒体播放器(播放视频)。创建适配器,将二者的功能融合。两个接口:

/*** 高级媒体播放器* 可播放视频*/
public interface AdvanceMediaPlayer {public void playVlc(String fileName);public void playMp4(String fileName);
}
/*** 媒体播放器接口* 可播放音频*/
public interface MediaPlayer {public void play(String audioType, String fileName);
}

写高级媒体播放器的实现类:

public class Mp4Player implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {当前格式为mp4格式,对vlc的播放不做具体实现}@Overridepublic void playMp4(String fileName) {System.out.println("播放Mp4文件:" + fileName);}
}
public class VlcPlayer implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("播放vlc文件:" + fileName);}@Overridepublic void playMp4(String fileName) {//当前格式为vlc格式,对mp4的播放不做具体实现}
}

创建适配器,注入待合并的那个接口的对象。自定义有参构造方法,并对待合并接口对象完成初始化赋值:

public class MediaPlayerAdapter implements MediaPlayer {private AdvanceMediaPlayer advanceMediaPlayer;/*** 定义个有参的构造方法,形参为自定义的String类型* @param audioType 媒体文件类型*/public MediaPlayerAdapter(String audioType) {if ("vlc".equalsIgnoreCase(audioType)) {advanceMediaPlayer = new VlcPlayer();} else if ("mp4".equalsIgnoreCase(audioType)) {advanceMediaPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {//判断当前媒体的格式是mp4还是vlcif ("vlc".equalsIgnoreCase(audioType)) {//播放vlc文件advanceMediaPlayer.playVlc(fileName);} else if ("mp4".equalsIgnoreCase(audioType)) {//播放mp4文件advanceMediaPlayer.playMp4(fileName);}}
}

到此,适配器拥有了待合并接口所有实现类的功能。写另一个接口媒体播放器的实现类,里面注入适配器对象,如果是音频,则实现类正常完成,如果是视频,则通过适配器完成:

public class AudioPlayer implements MediaPlayer {private MediaPlayerAdapter adapter;@Overridepublic void play(String audioType, String fileName) {//音频文件,比如mp3if ("mp3".equalsIgnoreCase(audioType)) {System.out.println("播放mp3文件:" + fileName);} else if ("vlc".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)) {//视频文件(高级媒体文件)adapter = new MediaPlayerAdapter(audioType);adapter.play(audioType, fileName);     //到此,完成了两个接口的适配,不管是音频还是视频,我这儿都能播放}}
}

到此,完成合并,测试类:

public class Test {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "啦啦啦.mp3");audioPlayer.play("vlc", "喜羊羊.vlc");audioPlayer.play("mp4", "视频.mp4");}
}

在这里插入图片描述

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

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

相关文章

Javase补充-Arrays类的常用方法汇总

文章目录 一 . 排序方法二 . 查找方法三 . 判断是否相等的方法四 . 拷贝方法五 . 填充方法 一 . 排序方法 我们第一个要介绍的就是sort方法 这个排序实现的底层逻辑应该是十分复杂的,以我们目前的水平体系应该无法理解,我们今天尝试用我们可以理解的一种排序算法,插入排序来模…

DEPART: Replica Decoupling for Distributed Key-Value Storage——论文泛读

FAST 2022 Paper 论文阅读笔记整理 问题 现代分布式KV存储通过在节点之间分发KV对的副本来采用复制以实现容错。然而,现有的分布式KV存储通常在同一索引结构中管理所有副本,例如LSM-Tree,从而导致复制冗余之外的大量I/O成本。 本文方法 提…

基于FastJson实现Json数据文件导入导出解析

哈喽,大家好,我是灰小猿,一个超会写bug的程序猿! 今天来记录一个在项目实战中比较实用的方法,主要是针对一些需要存在简单数据文件导入导出的场景,如:数据文件的简单备份、软件升版前后配置导入…

全量知识系统问题及SmartChat给出的答复 之5

Q15. 支持前端(知识表征)的自然语言能力 需要一个 元语言注释工具 以及两个库(叙词库和语料库)和主题词表。请 1)设计 两个库和主题词表的结构 ,2)分别设计它们的接口,3)通过调用它们…

dms深层肌肉刺激仪进口和国产的区别大吗?

DMS深层肌肉刺激仪(Deep Muscle Stimulator)通常被用于物理治疗和康复中,以及在运动训练领域中。国产和进口DMS深层肌肉刺激仪在本质上可能没有太大的差别,但主要有以下两点区别: 选用材料: DMS深层肌肉刺激…

GIT问题记录

一、 1.Gitee相关 复现步骤:自己在gitee上使用WEB解决冲突,本地未拉取最新的origin分支,然后本地也做了其他的修改,然后commit并且push,push时候报错,本地分支不干净 尝试拉取origin的最新内容&#xff…

游戏服务之会话管理

会话的概念与作用 游戏服务器 Session(会话)是指在游戏服务器和客户端之间建立的一个临时的连接。它可以用于存储和管理用户的游戏状态和信息。 当用户登录游戏时,服务器会为该用户创建一个 Session,可用于记录用户的登录状态、角色信息等个人信息。服务器会为每个会话分…

禁止safari浏览器网页双击缩放功能

普通浏览器 普通浏览器&#xff0c;只需要增加meta标签禁止缩放功能就行了 <meta content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0;" name"viewport" /> user-scalableno或0 //禁止双指缩放页面initial-scale1.0…

C++之std::vector

容器vector是一个可以改变大小的动态数组。 序列容器中的元素按严格的线性顺序排序。单个元素通过它们在此序列中的位置进行访问动态数组允许直接访问序列中的任何元素&#xff0c;甚至通过指针算术&#xff0c;并在序列末尾提供相对快速的元素添加/删除。 如何定义和初始化动…

【喜讯】优积科技CEO刘其东当选第十届杨浦区科协常委委员!

2023年09月21日&#xff0c;上海市杨浦区科学技术协会第十次代表大会于杨浦区人民政府机关2号楼四楼礼堂隆重召开&#xff01;公司CEO刘其东、COO周兴文、CPO胡艳玲、PM何壮志等来自全区各界的近三百名科技工作者代表参加会议。 大会现场 上海市杨浦区委书记薛侃&#xff0c;上…

CVE CNVD CNNVD

CVE 英文全称是“Common Vulnerabilities & Exposures” 通用漏洞披露。CVE就好像是一个字典表&#xff0c;为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。使用一个共同的名字&#xff0c;可以帮助用户在各自独立的各种漏洞数据库中和漏洞评估工具中…

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

针对KZG承诺和高效laconic OT的extractable witness encryption

1. 引言 2024年以太坊基金会等成员论文 Extractable Witness Encryption for KZG Commitments and Efficient Laconic OT&#xff0c;开源代码实现见&#xff1a; https://github.com/rot256/research-we-kzg&#xff08;Rust&#xff09; 在该论文中&#xff0c;提供了一种…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(八)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

5G-A,未来已来

目前&#xff0c;全国首个5G-A规模组网示范完成。这项由北京联通携手华为共同打造的示范项目&#xff0c;实现了北京市中心金融街、历史建筑长话大楼、大型综合性体育场北京工人体育场三个重点场景的连片覆盖。 实际路测结果显示&#xff0c;5G-A用户下行峰值速率达到10Gbps&am…

了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

安装使用zookeeper

先去官网下载zookeeper&#xff1a;Apache ZooKeeper 直接进入bin目录&#xff0c;使用powerShell打开。 输入: ./zkServer.cmd 命令&#xff0c;启动zookeeper。 zookeeper一般需要配合Dubbo一起使用&#xff0c;作为注册中心使用&#xff0c;可以参考另一篇博客&#xf…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先&#xff0c;来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型&#xff0c;分别是 &#xff1a; & string 字符串类型&#xff1b; & list 列表类型&#xff1b; & set 集合类型&#xff1b; & sorted set 有序集合类型&…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024数字中国创新大赛·数据要素赛道“能源大数据应用赛”正式上线!参赛指南请查收

近日&#xff0c;由国网福建电力承办的2024数字中国创新大赛能源大数据应用赛正式上线发布。赛事按照数字中国建设、能源革命的战略要求&#xff0c;围绕能源数据要素x、能源数字技术、能源商业模式等热点设置赛题&#xff0c;诚邀社会各界为加快建成新型电力系统出谋划策&…