【24种设计模式】适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换为客户端所期望的另一个接口。适配器模式使得原本因接口不兼容而无法一起工作的类可以协同工作。

适配器模式通常由三个角色组成:

目标接口(Target Interface):客户端所期望的接口,定义了客户端可以调用的方法。
适配器(Adapter):接口转换器,将原始类的接口转换为目标接口,通过适配器来与原始类进行交互。
原始类(Adaptee):需要被适配的类,它的接口与目标接口不兼容。

示例

下面是一个示例,展示如何使用适配器模式来连接不兼容的两个类:

// 目标接口
interface MediaPlayer {void play(String audioType, String fileName);
}// 原始类
class Mp3Player {public void playMp3(String fileName) {System.out.println("Playing MP3 file: " + fileName);}
}// 适配器
class MediaAdapter implements MediaPlayer {private Mp3Player mp3Player;public MediaAdapter() {this.mp3Player = new Mp3Player();}public void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {mp3Player.playMp3(fileName);} else {System.out.println("Invalid media type: " + audioType);}}
}// 客户端代码
public class Main {public static void main(String[] args) {MediaPlayer player = new MediaAdapter();player.play("mp3", "song.mp3");  // 通过适配器播放 MP3 文件player.play("mp4", "movie.mp4"); // 无法播放非 MP3 文件}
}

在上面的示例中,MediaPlayer 是目标接口,Mp3Player 是原始类。MediaAdapter 实现了 MediaPlayer 接口,并在其内部使用 Mp3Player 来实现适配逻辑。客户端通过 MediaAdapter 来调用 play 方法,并将不兼容的 MP4 文件转换为 MP3 文件进行播放。

适配器模式的优点在于它可以让不兼容的类一起工作,同时也遵守了开闭原则,使得客户端代码不需要修改便能够与新的适配器类一起工作。但需要注意的是,适配器模式并不推荐频繁使用,因为它可能引入额外的复杂性和性能损失。只有当两个类之间的接口不兼容且无法直接修改时,适配器模式才是一个合适的选择。

使用场景

适配器模式在以下场景中通常被使用:

第三方类库的集成:当你需要集成一个已存在的第三方类库,但其接口与你的代码不兼容时,适配器模式可以帮助你通过适配器来进行集成。
接口升级和兼容性:当你需要修改或升级一个已有的接口,并且不能直接修改客户端代码时,适配器模式可以用于保持旧接口的兼容性。
统一接口:当你希望提供一组统一的接口给多个类使用,而这些类具有不同的接口规范时,适配器模式可以将它们转换为统一的接口。
数据格式转换:当你需要将一种数据格式转换为另一种数据格式时,适配器模式可以用于处理数据转换逻辑。
已有功能的复用:当你想要复用已有的类,但其接口与你的需求不匹配时,适配器模式可以帮助你通过适配器进行复用。

总结

需要注意的是,适配器模式应该在有必要时才使用。如果在系统设计初期就能够预见到接口的变化或兼容性问题,那么最好在设计阶段就进行相关调整,避免引入适配器。此外,当系统越复杂时,使用适配器模式可能会增加代码的复杂性和理解难度,因此需要在评估后谨慎使用。

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

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

相关文章

ssm端游游戏账号销售管理系统源码和论文

ssm端游游戏账号销售管理系统源码和论文069 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面…

基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的仓库商品管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经…

嵌入式学习笔记——ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集(32-bit) Thumb态-Thumb指令集(16-bit) Thumb2态-Thumb2指令集(16 & 32 bit) Thumb指令集是对ARM指令集的一个子集重新编码得到的,指令长度为16位。通常在…

Jtti:如何通过宝塔面板快速安装WordPress博客源码?

通过宝塔面板快速安装WordPress博客源码是非常简单的。宝塔面板提供了图形化界面,使安装过程变得直观和方便。以下是通过宝塔面板安装WordPress的步骤: 登录宝塔面板: 打开您的Web浏览器,访问您的宝塔面板地址(通常是 …

【Spring Boot】数据库持久层框架MyBatis — MyBatis简介

MyBatis简介 本节首先会介绍什么是ORM、什么是MyBatis、MyBatis的特点以及核心概念,最后介绍MyBatis是如何启动、如何加载配置文件的? 1.什么是ORM ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象…

LoginPage.vue中的form

const form ref() const login async () > {await form.value.validate()const res await userLoginService(formModel.value)console.log(res)UserStore.setToken(res.data.token)ElMessage.success(登录成功)router.push(/) }<el-form:model"formModel":r…

高亮img、pdf重点部分(html2canvas、pdfjs-dist、react-pdf)

可用业务场景 报销单据审批中&#xff0c;高亮发票部分 需求 后台返回一张图片或者pdf、返回一组坐标&#xff0c;坐标类型[number,number,number,number]&#xff0c;分别代表了x、y、width、height。需要根据坐标在图片上高亮出来坐标位置。如下图 高亮的坐标是&#xff1…

Android 权限机制与及运行时权限申请示例

一、Android 权限机制 安装时权限声明 权限机制说明 安装软件时弹出软件所需要申请的全部权限&#xff0c;如果用户认可软件申请的权限&#xff0c;就会继续安装软件&#xff1b;如果用户不认可所申请的权限&#xff0c;就可以拒绝安装。 实现方式 在 AndroidManifest.mxl …

linux————keepalived+LVS(DR模式)

一、作用 使用keepalived解决LVS的单点故障 高可用集群 二、 调度器配置 环境 两台LVS服务 一主一备 两台web服务 采用nginx &#xff08;实现LVS负载均衡&#xff09; 服务ip 主LVS 192.168.100.3 备LVS 192.168.100.6 web1 192.…

nestjs:docker build时执行npm install sharp提示downloading libvips socket hang up

问题&#xff1a; 如题 参考&#xff1a; sharp - High performance Node.js image processing 参考chinese-mirror处理 原因&#xff1a; 默认是从github上下载libvips库&#xff0c;但是使用socket协议&#xff0c;linux下不挂载梯子是无法加速的&#xff0c;因此得更换下镜像…

创作2周年纪念日-特别篇

创作2周年纪念日-特别篇 1. 与CSDN的机缘2. 收获3. 憧憬 1. 与CSDN的机缘 很荣幸&#xff0c;在大学时候&#xff0c;能够接触到CSDN这样一个平台&#xff0c;当时对嵌入式开发、编程、计算机视觉等内容比较感兴趣。后面一个很偶然的联培实习机会&#xff0c;让我接触到了Pych…

中国平台软件市场研究报告:OceanBase为金融行业国产分布式数据库销售额第一

近日&#xff0c;《2022-2023年度中国平台软件市场研究报告》&#xff08;以下简称“报告”&#xff09;发布&#xff0c;报告对包括数据库、操作系统等在内的平台软件市场发展进行了分析。报告指出&#xff0c;在对平台软件需求增长最快的金融行业&#xff0c;OceanBase已占据…

音频母带制作::AAMS V4.0 Crack

自动音频母带制作简介。 使用 AAMS V4 让您的音乐听起来很美妙&#xff01; 作为从事音乐工作的音乐家&#xff0c;您在向公众发布材料时需要尽可能最好的声音&#xff0c;而为所有音频扬声器系统提供良好的商业声音是一项困难且耗时的任务。AI掌握的力量&#xff01; 掌控您…

关系型数据库与非关系型数据库类比

关系型数据库和非关系型数据库都有多种不同类型&#xff0c;每种类型都针对不同的数据存储需求和使用场景。以下是一些常见的关系型数据库和非关系型数据库类型&#xff1a; 关系型数据库类型&#xff1a; MySQL&#xff1a; 一种开源的关系型数据库管理系统&#xff0c;用于处…

Android studio APK切换多个摄像头(Camera2)

1.先设置camera的权限 <uses-permission android:name"android.permission.CAMERA" /> 2.布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"and…

Spring redis使用报错Read timed out排查解决

文章目录 使用场景报错信息解决方式 使用场景 我们使用redis作为缓存服务&#xff0c;缓存一些业务数据&#xff0c;如路口点位信息、渠化信息、设备信息等有一些需要实时计算的数据&#xff0c;缓存在redis里&#xff0c;如实时信号周期相位、周期内过车数量等有需要不同服务…

三分钟深入了解threejs的常见面试知识点

前序 由于金九银十准备到了。而且自己也有threejs的项目&#xff0c;但是threejs的面试知识点了解的比较少&#xff0c;然后就去学习了一些面试常见知识点&#xff0c;以备不时之需&#xff0c;用于记录的同时也可以通过了解这些知识点同时也能提高对threejs更多的认知。虽然没…

Druid配置类、Dubbo配置类、Captcha配置类、Redis配置类、RestTemplate配置类

DruidConfig配置类package com.xdclass.app.config;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.V…

Nodejs+Typescript+Eslint+Prettier+Husky项目构建

NodejsTypescriptEslintPrettierHusky项目构建 准备工作初始化项目Eslint安装和配置Prettier安装和配置在Eslint中使用Prettier插件Husky安装和配置修改tsconfig.json启用表示src目录 修改package.json设置vscode调试 仓库地址 准备工作 确保已经安装了git以及Node.js和npm&a…

docker高级(redis集群三主三从)

1. 新建6个docker容器redis实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilegedtrue -v /…