适配器模式

排序和查找实现适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch (int[], int)方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找) 立即下载

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件

介绍

意图:

  • 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

主要解决:

  • 主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的

何时使用:

  • 系统需要使用现有的类,而此类的接口不符合系统的需要

  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口

如何解决:

  • 继承或依赖(推荐)

关键代码:

  • 适配器继承或依赖已有的对象,实现想要的目标接口

应用实例:

  • 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V

  • JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式

优点:

  • 可以让任何两个没有关联的类一起运行

  • 提高了类的复用

  • 增加了类的透明度

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构

  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

使用场景:

  • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式

注意事项:

  • 适配器不是在详细设计时添加的,而是解决正在服役的项目的问题

实现

我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo,我们的演示类使用 AudioPlayer 类来播放各种格式
在这里插入图片描述

  1. 为媒体播放器和更高级的媒体播放器创建接口::

    //MediaPlayer.java
    public interface MediaPlayer {
    public void play(String audioType, String fileName);
    }

    //AdvancedMediaPlayer.java
    public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
    }

  2. 创建实现了 AdvancedMediaPlayer 接口的实体类::

    //VlcPlayer.java
    public class VlcPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
    System.out.println("Playing vlc file. Name: "+ fileName);
    }

    @Override
    public void playMp4(String fileName) {
       //什么也不做
    }
    

    }

    //Mp4Player.java
    public class Mp4Player implements AdvancedMediaPlayer{

    @Override
    public void playVlc(String fileName) {
       //什么也不做
    }
    
    @Override
    public void playMp4(String fileName) {
       System.out.println("Playing mp4 file. Name: "+ fileName);
    }
    

    }

  3. 创建实现了 MediaPlayer 接口的适配器类::

    //MediaAdapter.java
    public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMusicPlayer;
    
    public MediaAdapter(String audioType){
       if(audioType.equalsIgnoreCase("vlc") ){
          advancedMusicPlayer = new VlcPlayer();
       } else if (audioType.equalsIgnoreCase("mp4")){
          advancedMusicPlayer = new Mp4Player();
       }
    }
    
    @Override
    public void play(String audioType, String fileName) {
       if(audioType.equalsIgnoreCase("vlc")){
          advancedMusicPlayer.playVlc(fileName);
       }else if(audioType.equalsIgnoreCase("mp4")){
          advancedMusicPlayer.playMp4(fileName);
       }
    }
    

    }

  4. 创建实现了 MediaPlayer 接口的实体类::

    //AudioPlayer.java
    public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
    
       //播放 mp3 音乐文件的内置支持
       if(audioType.equalsIgnoreCase("mp3")){
          System.out.println("Playing mp3 file. Name: "+ fileName);
       }
       //mediaAdapter 提供了播放其他文件格式的支持
       else if(audioType.equalsIgnoreCase("vlc")
          || audioType.equalsIgnoreCase("mp4")){
          mediaAdapter = new MediaAdapter(audioType);
          mediaAdapter.play(audioType, fileName);
       }
       else{
          System.out.println("Invalid media. "+
             audioType + " format not supported");
       }
    }
    

    }

  5. 使用 AudioPlayer 来播放不同类型的音频格式::

    //AdapterPatternDemo.java
    public class AdapterPatternDemo {
    public static void main(String[] args) {
    AudioPlayer audioPlayer = new AudioPlayer();

       audioPlayer.play("mp3", "beyond the horizon.mp3");
       audioPlayer.play("mp4", "alone.mp4");
       audioPlayer.play("vlc", "far far away.vlc");
       audioPlayer.play("avi", "mind me.avi");
    }
    

    }

从零开始:使用Mask2Former训练你的专属图像分割数据集 本文详细介绍了如何使用Mask2Former训练自定义图像分割数据集,从环境配置、数据集准备到模型训练与优化。通过实战技巧和问题排查指南,帮助开发者高效完成从零开始的图像分割任务,特别适合需要处理自定义数据集的AI研究人员和工程师。 阅读详情

相关推荐

金融级IT架构-数字银行的云原生架构解析

最近断断续续花了差不多2到3周的时间阅读完由电子工业出版社出版的《金融级IT架构:数字银行的云原生架构解密》的这本书,作者是作者是网商银行技术编委会。 本书契合了当前银行业分布式架构转型趋势,内容是经过实践检验的领先技术介绍了网商银行IT技术架构演进路线,涵盖了分布式、单元化、弹性混合云、云原生多个基础架构领域,同时介绍了技术风险、安全可信、业务架构等多方面的技术实践经验。 对于这本书实际很早搜索云原生相关书籍的时候就搜索到,但是一看标题是金融IT架构方面的因此没有引起太多的重视,后面由华章...

年少有为 4065

适配器模式(Adapter Pattern)

一、定义 适配器模式(Adapter Pattern):结构型模式之一,将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 二、UML类图 三、角色职责 目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。 源角色(Adaptee):你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。 适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器

奶油芝士蘑菇汤的博客 2万+

在Ubuntu 18下安装SIMULIA Abaqus 2020

参考资料: https://github.com/imirzov/Install-Abaqus-2019-on-Ubuntu-18.04-LTS 安装环境: Ubuntu 18.4 LTS 软件版本: SIMULIA for Linux 2020 1 准备 安装光盘及破解文件 解压光盘至一目录,不能挂载,因为要修改文件内容 /home/sunwk/Downloads/abaqus2020 更改文件权限为最大 sudo chmod -R 777 abaqus2020/ * 复制libpng12

oak619的博客 1万+

设计模式第9讲——适配器模式(Adapter)

适配器模式是一种结构型设计模式,它允许将不兼容的对象转换成可兼容的接口。主要目的是解决在不改变现有代码的情况下,使不兼容的接口之间能够正常工作,通过创建一个中间转换的适配器来将一个对象转换成我们所需要的接口。当我们去国外旅游时,我们可能只会汉语,而当地人只会英语,那么这个时候就需要一个翻译员(翻译软件)来帮助我们。这就类似于适配器模式,通过一个适配器将一个不兼容的接口转成另外一个接口。下面以翻译为例,介绍一下类、接口、对象适配器。

让~学习~成为一种习惯(橡 皮 人の技术博客) 3万+

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

qq_41510657的博客 2617

华为昇腾(Ascend)开发考试原题目解析 (2024) (题库一)——HCIP-AI-Ascend Developer——第一部分

给出一段代码如下,以下哪个选项描述错误?...A.中的语句由 MindSpore 接管,有语法限制B. 算子在中定义,并用来建立网络C.__init__()中的语句由 Python 解析执行D. 网络定义必须继承基类nn.Cell正确答案: B__init__()用于定义算子和网络层。所有需要用到的层(如卷积层、全连接层等)都应该在这里进行实例化。这部分代码由Python解释器执行。用于构建前向计算图。它调用在__init__()中定义好的算子和层来描述数据的流向。

qq_38334677的博客 1054

设计模式之适配器模式详解

设计模式之适配器模式详解 文章目录设计模式之适配器模式详解一、什么是适配器模式二、适配器模式的角色组成三、适配器模式应用场景四、适配器模式--类适配器示例五、适配器模式--对象适配器示例六、适配器模式--接口适配器示例七、适配器模式优缺点 一、什么是适配器模式 适配器模式(Adapter Pattern) 也称为变压器模式 ,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式其实起着转化、委托的作用,将一种接

weixin_45538589的博客 4193

毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行

毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行

356

设计模式-适配器模式(Adapter)

适配器模式(Adapter Pattern)是一种结构型设计模式,它主要用于解决两个不兼容的接口之间的问题。这种模式通过结合两个独立接口的功能,使原本不能一起工作的那些类可以一起工作。适配器模式涉及到一个单一的类,这个类负责将独立的或不兼容的接口功能整合到一起。举个例子,读卡器就是作为内存卡和笔记本之间的适配器。我们先把内存卡插入读卡器,再把读卡器插入笔记本,然后就可以通过笔记本来读取内存卡的内容了。

miaoyl的博客 5712

AI金融投资002:批量下载巨潮资讯基金招募说明书

封闭式基础设施证券投资基金招募说明书 AI金融投资002:批量下载巨潮资讯基金招募说明书

LuckyHanMo的博客 2200

【企业智能体开发】优化模型成本、延迟与失败降级

小林的培训快开始时,服务台花很久“思考最优回答”,体验并不会更好。反过来,为了省钱而始终选最轻的模型,若连房间、连接方式和任务状态都识别不稳,后续错误检索和重复建单会造成更大代价。企业 Agent 的优化对象不是单次模型调用价格,而是任务在可接受时间内、安全地推进到正确结果的总成本。

Mr数据杨 896

23种设计模式:适配器模式(最强解析!!!)

适配器模式是23种设计模式之一。 适配器模式作用 适配器模式的作用,在于将一个类的接口变换为客户端所期待的另一种接口,使得原本因为接口不匹配而无法一起工作的两个类能在一起工作。 也就是说,适配器模式解决的是接口兼容性问题。 适配器模式实现方式 适配器模式依据实现方式的不同,可以划分为3种:类适配器、对象适配器和接口适配器。 (一)类适配器 类适配器类图如下: 类适配器主要由三部分构成: Target:目标角色,也即被转换后的接口; Adaptee:源角色,需要被转换的接口; Ad.

进击的Coder*的博客 4716

手把手教你学simulink(41.4)--逆变器电场景示例:基于Simulink的主从控制的多逆变器协同控制(Multi-Inverter Coordinated Control)

需求分析在现代电力系统中,分布式发电和储能系统的广泛应用使得多个逆变器并联运行成为常见的应用场景。为了确保多个逆变器之间的协同工作,实现系统的稳定性和高效性,通常采用主从控制(Master-Slave Control)策略。主从控制通过一个主控制器(Master)来协调多个从控制器(Slave),确保所有逆变器的输出电压、频率和功率分配符合预期目标。本项目将基于Simulink平台,开发一个多逆变器协同控制系统,采用主从控制策略,实现对多个逆变器的精确控制和优化。

MHD0815的博客 307

适配器模式(AdapterPattern)

定义 将一个接口转换客户希望的另一个接口,使接口不兼容的那些类能够一起工作,又名包装器(Wrapper)。适配器模式可以为对象适配器模式,也可以是类适配器模式 结构图 角色与理解 对象适配器模式包含如下角色 Target(目标抽象类):定义客户所需接口,可以是接口、抽象类或者具体类 Adapter(适配器):继承实现Target关联Adaptee,完成接口的转换 Adaptee(适配者):定义存在的接口被适配器适配 对象适配器的核心是适配器继承或者实现目标类委派适配者(.

码农架构 647

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

设计模式之AdapterPattern适配器模式

在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。 通俗来讲,适配器就是一个中转站,把A模型转换为B模型。 适配器模式的定义与特点: 定义如下: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,类结构型模式类之间的耦合

haoyuegongzi的博客 253

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

适配器模式(AdapterPattern)

文章目录模式动机模式定义模式结构模式优点模式缺点模式适用模式应用模式拓展总结 适配器模式 将一个类的接口转换成客户端希望的另外的一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 系统的数据和行为都正确,但接口不符合时,我们应该考虑使用适配器模式,目的是使得控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用在希望复用一些现存的类,但是接口又与复用环境要求不一致的情况下。 类适配器和对象适配器 当想使用一个已经存在的类,但如果他的接口,也就是他的方法和你要求的不相同

Sharker_Blog的博客 263

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式——适配器模式

● 适配器模式是将某个类的接口转化成客户端需要的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)● 适配器模式属于结构型模式● 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式①、可以让任何两个没有关联的类一起运行。②、提高了类的复用。③、增加了类的透明度。④、灵活性好。①、过多地使用适配器,会让系统非常凌乱,不易整体进行把握。

程序猿进阶 2000

您的设计模式——适配器模式【Adapter Pattern】

这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?是的,一样的作用,两个不同接口,有不同的实现,但是某一天突然上帝命令你把 B 接口 转换

505

设计模式之适配器模式AdapterPattern(八)

适配器模式 (Adapter Pattern) 是一种结构型设计模式,它通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类能够协同工作。适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,故应用相对较少。

徐泗空的博客 676

设计模式适配器模式(AdapterPattern)

核心模块:Target目标类、Adaptee被适配者、Adapter适配器 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:将目标类和适配者类解耦,一般用于接入第三方库; 优点:增加了类的透明性,新加adaptee只需要新加Adapter; 缺点:不支持多重继承,一个Adapter只能适配一

didiao11300的专栏 329

适配器模式【Adapter Pattern 】

博客地址  http://blog.youkuaiyun.com/ftx2540993425   下面横线以上内容是借鉴别人的,为了表达对作者的敬意,不做不恰当的修改,我个人的总结在后面。 好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛。今天讲适配器模式,这 个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用, 虽然两个国家的的电源

菜鸟的飞翔 475

【JAVA设计模式】之适配器模式(AdapterPattern)

使用场景 复用现有类的功能。 项目并非都是从零开始,而在我们编程过程中,也不是所有的功能都需要重新去写,复用现有类的功能是最直接有效的途径 版本升级与兼容性。 随着版本的迭代升级,旧有的一些功能渐渐无法满足需求,现实中又不能直接摒弃,使用Adapter模式可以轻松的来兼容维护新旧版本 图解适配器模式 ...

兵临城下的博客 286

设计模式 - 学习笔记 - 适配器模式AdapterPattern

设计模式 - 学习笔记 - 适配器模式原理分析代码演示电源插座 ElectricalSocket两口插头 PlugUSB公口手机充电器(适配器) ChargerAdapter客户端 AdapterPatternDemo 原理分析 适配器就是:扩展坞、转换器、充电头。 解决的问题就是将一个目标不支持的接口,转变成一个能用的接口。 典型场景就是功能都具备,只是接口对不上。 代码演示 电源插座 ElectricalSocket public class ElectricalSocket{ public vo

灵台方寸山斜月三星洞 606
上一篇: 原型模式
下一篇: 桥接模式
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值