金三银四面试题(二十七):适配器模式知多少?

news2024/11/19 5:28:58

什么是适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换为客户期望的另一个接口。通过适配器,原本不兼容的接口可以一起工作,从而提高系统的灵活性和可扩展性。

关键元素:

  1. 目标接口:客户端希望使用的接口。
  2. 适配器类:一个中间类,实现目标接口,并将对目标接口的方法调用转发给需要适配的类。
  3. 被适配者类:需要被适配的类,它有一个不兼容的接口。

优势:

  • 兼容性:将不兼容的接口转换为兼容的接口。
  • 解耦:客户端不需要关心被适配者类的具体接口,适配器负责处理这些细节。
  • 灵活性:可以在不改变原始类的情况下,添加新功能。

缺点

  • 过多地使用适配器,容易使代码结构混乱,如明明看到调用的是A 接口,内部调用的却是B 接口的实现。

举个例子:

我们有一个名为 MediaPlayer 的目标接口,表示一个媒体播放器;还有一个被适配的类 AdvancedMediaPlayer,表示一个高级媒体播放器。通过 MediaPlayerAdapter 类,将 AdvancedMediaPlayer 适配为 MediaPlayer 接口。

// 目标接口:MediaPlayer
interface MediaPlayer {
    void play(String audioType, String fileName);
}

// 被适配者类:AdvancedMediaPlayer
class AdvancedMediaPlayer {
    void playVlc(String fileName) {
        System.out.println("Playing VLC file: " + fileName);
    }

    void playMp4(String fileName) {
        System.out.println("Playing MP4 file: " + fileName);
    }
}

// 适配器类:MediaPlayerAdapter,将 AdvancedMediaPlayer 适配为 MediaPlayer
class MediaPlayerAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedMediaPlayer;

    // 构造函数中创建被适配者类的实例
    public MediaPlayerAdapter() {
        this.advancedMediaPlayer = new AdvancedMediaPlayer();
    }

    @Override
    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("Unsupported audio type: " + audioType);
        }
    }
}

// 客户端代码
public class AdapterPatternExample {
    public static void main(String[] args) {
        // 创建 MediaPlayerAdapter 对象
        MediaPlayer mediaPlayer = new MediaPlayerAdapter();

        // 使用 MediaPlayer 接口播放不同类型的音频文件
        mediaPlayer.play("vlc", "song1.vlc");
        mediaPlayer.play("mp4", "song2.mp4");
        mediaPlayer.play("mp3", "song3.mp3"); // 不支持的音频类型
    }
}

MediaPlayerAdapter 类实现了 MediaPlayer 接口,并在其中使用 AdvancedMediaPlayer 类的实例。通过适配器,客户端可以使用 MediaPlayer 接口播放不同类型的音频文件,而不需要直接与 AdvancedMediaPlayer 类交互。

在这里插入图片描述

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

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

相关文章

开发测试必须知道的 10种 常见软件架构模式

你是否想知道企业大规模系统是如何设计的? 在软件开发开始之前,我们必须选择一个合适的架构,能提供所需的功能和质量特性。因此,在将架构应用到我们的设计之前,我们应该了解各种不同架构的特点。 01 什么是架构模式 根据维基百…

parallelsdesktop19密钥激活 PD19虚拟机完整图文安装教程

Parallels Desktop 19 (简称 PD 19)是最新发布的 macOS 平台的 windows 虚拟机,本文是使用 Parallels Desktop 19 虚拟机安装 Windows 的详细图文破解安装教程。 一下载安装 Parallels Desktop 软件下载完成后打开,双击打开 安装.dmg Para…

【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型

文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文:Monkey : …

【核弹】我的第一款IDEA插件

SuperHotSwap 插件名称叫做:SuperHotSwap(超级热更新) 开发初心:旨在做出一款最便捷的IDEA热更新插件,减少用户操作步骤,提供零配置的可视化操作更新。 为什么要写这个插件: 每次改一下Mappe…

android自定义view仿微信联系人列表

说明:最近碰到一个需求,弄一个类似国家或省份列表,样式参照微信联系人 文件列表: step1:主界面 加载列表数据~\app\src\main\java\com\example\iosdialogdemo\MainActivity.java step2:右侧列表数据排序~\app\src\com\example\io…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标:(1)创建5个执行器:蜂鸣器,LED1,LED2,ED3,LED4;(2)执行器能对…

VLAN 综合实验

一、实验拓扑 二、实验需求 1.PC1和PC3所在接口为access,属于vlan2; PC2/4/5/6处于同一网段,其中PC2可以访问PC4/5/6; 2.PC5不能访问PC6; 3.PC1/3与PC2/4/5/6不在同一网段; 4.所有PC通过DHCP获取IP地址,且PC1/3可以…

《Python编程从入门到实践》day28

# 昨日知识点回顾 安装Matplotlib 绘制简单的折线图 # 今日知识点学习 15.2.1 修改标签文字和线条粗细 # module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? # 解决办法:matplotlib切换图形界面显示终端TkAgg。 #…

SpringBoot自动装配(二)

近日,余溺于先贤古哲之文无法自拔。虽未明其中真意,但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰:“臣闻之:‘疑行无名,疑事无功。’君亟定变法之虑,殆无顾天下之议之也。且夫有高人之行者,…

游戏数值策划关卡策划文案策划系统策划及游戏运营干货

1.《游戏新手村》免费电子书 我2007年开始做网络游戏,后面又做过网页游戏和手机游戏。当时市面上关于游戏策划和运营的书籍屈指可数,于是我就想着要不我写一本吧,然后2014年10月开始撰写。关于本书的更多信息可查看这篇文章>> 游戏新手…

45.WEB渗透测试-信息收集-域名、指纹收集(7)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:计算机王-CSDN博客 WEB指纹:Web指纹也叫web应用指纹。由于所使用的工具、技术…

蓝鹏测控:扩大出口,勇拓海外市场

蓝鹏测控自2012年成立以来,始终专注于工业测量仪器的研发、生产与销售。公司坚持经验与创新并存,长期与华北电力大学、河北大学等多所知名院校深度合作,拥有一支技术力量雄厚的研发团队。经过多年的努力,蓝鹏测控已研发出多款具有…

MYSQL中的DQL

语法: select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段 limit 分页参数 条件查询 语法: 查询多个字段:select 字段1,字段2 from表名 查询所有字段&#xff1a…

【计算机毕业设计】基于SSM+Vue的线上旅行信息管理系统【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 设计原则 1.3 论文组织结构 2 系统关键技术 2.1JSP技术 2.2 JAVA技术 2.3 B/S结构 2.4 MYSQL数据库 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3 经济可行性 3.1.4 法律可行性 3.2系统功能分析 3.2.1管理员功能分析 3.2.…

PCie协议之-TLP Header详解(一)

✨前言: 在PCIe通信过程中,事务层数据包(Transaction Layer Packets,简称TLP)扮演着非常重要的角色。TLP用于在设备之间传递数据和控制信息,它们是PCIe的基本信息传输单元。 TLP可分为几个部分&#xff0c…

【平衡二叉树】AVL树(双旋)

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解AVL树的左双选和右双旋的相关内容。 如果看到最后您觉得这篇文章写…

Qt学习笔记1.3.3QtCore-隐式共享

文章目录 概述隐式共享细节类列表 Qt中的许多c类使用隐式数据共享来最大化资源使用并最小化复制。隐式共享类作为参数传递时既安全又高效,因为只传递指向数据的指针,并且只有当函数写入数据时才会复制数据,即写时复制(copy-on-write)。 概述 …

keepalived双机热备超详细入门介绍

keepalived 一、keepalived入门介绍 1.keepalived简介 2.keepalived服务的三个重要功能 2.1.管理LVS负载均衡软件 2.2.实现对LVS集群节点健康检查功能 2.3.作为系统网络服务的高可用功能 3.keepalived高可用故障切换转移原理 4.keepalived安装及主配置文件介绍 …

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1,发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

【经验总结】超算互联网服务器 transformers 加载本地模型

1. 背景 使用 超算互联网 的云服务,不能连接外网,只能把模型下载到本地,再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…