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

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。

适配器模式涉及角色:

  1. 目标接口(Target Interface):目标接口是客户端所期望的接口,适配器将源接口转换为目标接口以满足客户端的需求。
  2. 适配器(Adapter):适配器是一个实现了目标接口的类,它持有一个源接口的引用。适配器通过调用源接口的方法来完成客户端的请求,并根据需要进行数据转换和适配。
  3. 源接口(Adaptee Interface):源接口是需要被适配的接口,它定义了适配器需要转换成目标接口的方法。。

适配器模式的使用场景

  1. 兼容性问题:当有两个或多个类之间存在兼容性问题,无法直接进行交互时,可以使用适配器模式。适配器将不兼容的接口转换成目标接口,使得这些类能够协同工作
  2. 类库的使用:当需要使用一个已有的类库,但其接口与当前系统的需要不符时,可以使用适配器来适配该类库的接口,以便于在当前系统中使用。
  3. 组件复用:当希望复用已有的组件,并且这些组件的接口与当前系统的需求不一致时,可以使用适配器模式来对这些组件进行适配,以便在当前系统中复用它们。
  4. 系统扩展性:当系统需要扩展以支持新的功能或接口时,可以使用适配器模式。通过适配器,能够方便地添加新的适配器来支持新的功能或接口,而无需修改现有的代码。
    适配器模式提供了一种解决兼容性问题和接口不一致问题的灵活方式,可以有效地将现有的代码与新的需求或组件进行集成。

适配器模式的java代码实例

// 目标接口
interface MediaPlayer {void play(String audioType, String fileName);
}// 具体目标类
class AudioPlayer implements MediaPlayer {public void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file: " + fileName);} else {System.out.println("Invalid media type");}}
}// 高级媒体播放器接口
interface AdvancedMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}// 具体高级媒体播放器类
class VlcPlayer implements AdvancedMediaPlayer {public void playVlc(String fileName) {System.out.println("Playing vlc file: " + fileName);}public void playMp4(String fileName) {// 不支持,不做任何操作}
}class Mp4Player implements AdvancedMediaPlayer {public void playVlc(String fileName) {// 不支持,不做任何操作}public void playMp4(String fileName) {System.out.println("Playing mp4 file: " + fileName);}
}// 适配器类
class MediaAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer = new Mp4Player();}}public void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer.playMp4(fileName);} else {System.out.println("Invalid media type");}}
}// 客户端代码
public class Main {public static void main(String[] args) {MediaPlayer mediaPlayer = new AudioPlayer();mediaPlayer.play("mp3", "song.mp3"); // 直接播放MP3文件mediaPlayer = new MediaAdapter("vlc");mediaPlayer.play("vlc", "movie.vlc"); // 使用适配器播放VLC文件mediaPlayer = new MediaAdapter("mp4");mediaPlayer.play("mp4", "video.mp4"); // 使用适配器播放MP4文件}
}

在上面的示例中,MediaPlayer 是目标接口,AudioPlayer 是具体目标类,它可以直接播放 mp3 文件。AdvancedMediaPlayer 是高级媒体播放器接口,VlcPlayer 和 Mp4Player 是具体的高级媒体播放器类。

MediaAdapter 是适配器类,它实现了目标接口 MediaPlayer,并在内部封装了一个高级媒体播放器对象。根据传入的音频类型,它选择合适的高级媒体播放器来播放相应的文件。

在客户端代码中,我们首先创建一个 AudioPlayer 对象,然后直接使用它来播放 mp3 文件。接着,我们再使用适配器将 AudioPlayer 转换成 MediaPlayer 对象,并使用适配器对象来播放 vlc 文件和 mp4 文件。这样,即使目标接口和高级媒体播放器之间存在兼容性问题,我们也可以通过适配器将它们协同工作起来。

适配器模式的优缺点

适配器模式用于解决接口不兼容的问题。它将不同接口的对象进行转换,使其能够协同工作。适配器模式有以下优缺点:
优点:

  1. 解决接口不兼容问题:适配器模式能够处理不同接口之间的兼容性问题,使得不兼容的类能够协同工作。
  2. 重用现有功能:适配器模式可以重用已经存在的功能实现。通过适配器模式,我们可以使用已有的类来实现新的接口需求,而无需修改现有代码。
  3. 扩展性良好:通过适配器模式,可以轻松地添加新的适配器类来支持更多的对象和接口。

缺点:

  1. 增加复杂性:引入适配器会增加系统的复杂性和代码量,因为需要额外的适配器类来转换接口。
  2. 运行时效率损失:由于适配器会在客户端代码和适配者之间增加一层间接调用,可能会导致运行时的效率损失。
    总体来说,适配器模式是在接口不兼容的情况下使用的一种很有用的设计模式。它帮助我们解决了不同接口之间的兼容性问题,并能够重用现有代码。然而,适配器模式也会引入一些复杂性,需要权衡其使用时带来的好处和额外的成本。

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

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

相关文章

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径?不定期会收到类似的问题,我只想说:嵌入式软件开发没有捷径 说实话,有这种想法的人,我其实想劝你放弃。对于绝大多数普通人,一步一个脚印就是捷径。 当然,这个问题…

4-7月预测价差方向准确率统计

月度 预测价差方向准确率 4月 33.6% 5月 28.4% 6月 25.7% 7月 34.2% 4-7月合计 30.6%

VLAN介绍

目录 VLAN的特点: VLAN的好处: VLAN的实现原理 VLAN标签 VLAN的划分方式 接口划分VLAN--接口类型 Access接口 Trunk接口 Hybrid接口 实现VLAN之间通信 使用路由器物理接口 使用子接口 使用三层交换机的VLANIF接口 配置 VLANIF的转发流程 三层交换机参与下的三层…

IDEA偶尔编译的时候不识别lombok

偶尔IDEA启动项目的时候会识别不到lombok,识别不到get()跟set()方法 方案 在settings添加下面代码 -Djps.track.ap.dependenciesfalse

dialog => :before-close的属性应用

在element-ui里面关闭弹窗的时候before-close会触发。 也就是点击X的时候回触发before-close这个属性, 代码实例: <el-dialogtitle"新增用户":visible.sync"dialogVisible"width"50%":before-close"handleClose"> handleClose…

linux学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位&#xff0c;用来配置io口&#xff0c;其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的&#xff0c;GPIO1_IO00 一共可以复用为 9种功能 IO&#xff0c;分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

在线餐饮油烟实时监测系统的设计与实现

安科瑞 华楠 摘 要&#xff1a;为了解决传统油烟检测方法中成本高、效率低、实时性差等问题&#xff0c;设计开发了一种在线油烟实时监测系统&#xff1b;系统由采集、通讯、服务器和用户交互四个模块组成&#xff1b;采集模块采集油烟数据&#xff0c;通过GPRS通讯技术将数据发…

KL15 是什么?ACC,crank,on等

KL含义 KL is the abbreviation for klemme which is the German term for connector / connection.KL是“ klemme”的缩写&#xff0c;这是德语中连接器或连接的术语。 KL30 &#xff0c;通常表示电瓶的正极。positive KL31&#xff0c;通常表示电瓶的负极。negative KL15, 通…

面试题:JS中的String常见方法有哪些?

面试题&#xff1a;说不出五个就尴尬了&#xff01;我目前只写了几个方法&#xff0c;待更新中。。。 1、length2、slice()3、substr()4、substring()5、split()6、indexOf() 1、length 作用&#xff1a;检测字符串的长度。 let str abcde console.log(str.length) // 52、sl…

Git rebase、merge、cherry-pick用法

项目开发过程中&#xff0c;一般会有一个主分支&#xff0c;用来进行版本发布&#xff0c;研发会新建一个属于自己的开发分支&#xff0c;一个功能开发完成后会合入主分支 新建分支 D:\workspace\android>git checkout -b develop_test origin/develop_main Switched to a…

在外地ssh远程连接家里ubuntu服务器(Coplar内网穿透)

官网&#xff1a;https://www.cpolar.com/ 步骤&#xff1a; 按照官网文档&#xff08;https://www.cpolar.com/docs&#xff09;在家里ubuntu上安装&#xff0c;并且开通隧道即可&#xff0c;不需要在自己笔记本安装 需要注意的是&#xff1a; 可以先安装ssh许可&#xff0c…

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

hadoop与HDFS交互

一、利用Shell命令与HDFS进行交互 在进行HDFS编程实践前&#xff0c;需要首先启动Hadoop。可以执行如下命令启动Hadoop&#xff1a; cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop Hadoop支持很多Shell命令&#xff0c;其中fs是HDFS最常用的命令&#xff0c;利用fs…

ChatGPT的功能与特点

随着人工智能技术的不断发展&#xff0c;ChatGPT作为OpenAI公司开发的基于GPT-3.5架构的大型语言模型&#xff0c;正引领着智能交互的新纪元。ChatGPT的功能与特点使其能够在多个领域展现出惊人的能力&#xff0c;本文将深入探讨ChatGPT的功能与特点&#xff0c;以及它在人工智…

HCIA-datacom数通题库和录播视频资料

HCIA-Datacom&#xff0c;是华为数通认证的初级考试&#xff0c;培训与认证具备数通基础通用知识和技能水平的工程师&#xff0c;只是入门了解数通的一些基础通用知识&#xff0c;适用于小白了解和学习数通知识点起点。 个人建议还是有必要考的&#xff0c;如果在企业考试考试…

Kubernetes (k8s)理论介绍

一&#xff1a;K8s 简介 1、K8s作用 2、K8s 来历 3、为什么要用 K8S? 4、Kubernetes 功能 二&#xff1a;Kubernetes 集群架构与组件 1、Kubernetes 集群架构与组件 2、核心组件 -Master 组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube…

【数据预测】基于蜣螂优化算法DBO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#53】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 蜣螂优化算法DBO2. 变分模态分解VMD3. 核极限学习机KELM4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 蜣螂…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中&#xff0c;Feed流是一种常见的功能&#xff0c;它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式&#xff0c;包括拉模式、推模式和推拉结合模式。在本文中&#xff0c;我们将详细介绍这三种模式&#xff0c;并通过Java代码示例来实现…

关于BQ27427的配置问题

EVM是TI家做的BQ27427的开发板&#xff0c;这款芯片还挺新的。 大概是这样&#xff0c;一块开发板要一千多块钱&#xff0c;使用的时候还出现了一些奇怪的问题。 配置使用的是买的盗版的EV2400&#xff0c;就是黑色的那个东西&#xff0c;使用的通信方式IIC。 TI手册上写的软件…

Spring框架 —— AOP面向切面编程

前言 前面荔枝已经梳理了Spring框架中的IOC部分的知识&#xff0c;接下来荔枝继续梳理Spring框架的另一大重点&#xff1a;AOP面向切面编程。在这篇文章中&#xff0c;荔枝会着重弄清楚AOP的概念并对实现AOP的两种方式进行梳理&#xff0c;同时荔枝也会相应给出代码样例。毕竟荔…