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

什么是适配器模式

适配器模式(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();}@Overridepublic 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.hqwc.cn/news/697185.html

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

相关文章

阿里天池基于LLM智能问答系统学习赛排到第一名了

阿里天池基于LLM智能问答系统学习赛排到第一名了 0. 引言1. 05-09分数排到第一名了 0. 引言 5.1 假期期间发现阿里天池基于LLM智能问答系统学习赛正好是我工作上用到的技术,就抱着玩一玩的心里挑战了一下。 这个比赛包含了text_comprehension(RAG&…

小米/红米手机刷机错误:Missmatching image and device

报错: Missmatching image and device。 场景: 该解决方法只适用于手机是通过EMT解锁的。 解决方法: 打开刷机脚本,并注释检测脚本: 刷机脚本根据不同的刷机方式,选择编辑不同的脚本,例如&am…

电机及FOC算法介绍

一.电机概述 1.电机的简介 电机是一种可以在电能和机械能的之间相互转换的设备,其中发电机是将机械能转换为电能,电动机是将电能转换为机械能。发电机的主要用于产生电能,用途单一,但是电动机主要用于产生机械能,用途…

法国签证照片尺寸怎么调整?图片调整尺寸的方法介绍

在我们的平时生活中,个人证件照是我们必不可少的身份证明,它是一种具有严格尺寸和比例要求的特殊照片,对于一些特定的场合,比如我们在申请法国签证的时候,需要把照片调整到规定的大小尺寸,那么,…

物联网设计竞赛_2_Jetson Nano中文输入法配置安装vscode

1、装ibus和ibus依赖框架 sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 2、启动ibus im-config -s ibus 3、安装拼音引擎 sudo apt-get install ibus-pinyin 4、重启linux系统 shutdown -r now 5、进入ibus设置添加中文 ibus-setup 插入中文p…

【Gitlab远程访问本地仓库】Gitlab如何安装配置并结合内网穿透实现远程访问本地仓库进行管理

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具&#xf…

数学老师们

小学三年级之前的数学老师,包括学前班给过我零分的数学老师,模样、姓名都不记得了。能回忆起来的最早的数学老师是四、五年级的李成娥老师。 李老师四十岁左右,短发,温和、爱笑,尤其是在班主任张老师的衬托下&#xf…

vue从入门到精通(一):初始Vue

一,Vue是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代…

数组 | 双指针经典题目

Leetcode977:有序数组的平方 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/squares-of-a-sorted-array/d…

STC8增强型单片机开发day04

热敏电阻 NTC(Negative Temperature Coefficient)是指随温度上升电阻减小、具有负温度系数的热敏电阻现象和材料 原理图 ADC功能引脚ADC0P1.0ADC1P1.1ADC2P5.4ADC3P1.3ADC4P1.4ADC5P1.5ADC6P1.6ADC7P1.7ADC8P0.0ADC9P0.1ADC10P0.2ADC11P0.3ADC12P0.4ADC13P0.5ADC14P0.6 温度…

AI试衣IDM-VTON,Windows11本地安装配置记录!

昨天我们已经介绍过IDM-VTON这个开源项目了。 通过这个软件可以轻松实现一键换衣服。 昨天,简单演示了一下在线使用。 今天,来演示如何安装到本地电脑上! 本地配置会有一定的专业性,懂的人可以参考下。 不懂得直接拉到最后&am…

智能酒精壁炉与酒店前台的氛围搭配

智能酒精壁炉与酒店前台的氛围搭配可以为前台区域增添舒适、现代和独特的氛围,以下是一些建议: 欢迎区域装饰: 将智能酒精壁炉作为前台欢迎区域的装饰物,放置在客人抵达的显眼位置。选择现代设计的壁炉款式,如壁挂式…