带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern)
- 适配器模式
- 适配器模式(Adapter Pattern)概述
- talk is cheap, show you my code
- 总结
适配器模式
适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计模式。它允许不兼容的接口协同工作,通过创建一个适配器类来转换某个类的接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
ok,概念还是太抽象了。来个例子就生动一点。
我们举个手机充电的例子,我们充电头适配的是国内的电网。可是我们国家的电网工作电压与频率不一定与国外的一样,如果我们需要去国外生活或者旅游,怎么办呢? 首先下面我们展示两种充电插头,一种是国标的,另一种是国外的。


我们会怎么办呢? 一般来说,我们会买一个充电转换头

这样的话,我们的充电器就可以在国外正常使用了。其实这样一种实现,就是适配器模式(Adapter Pattern)的体现。
适配器模式(Adapter Pattern)概述
- 适配器模式定义与目的
- 定义:适配器模式是一种结构型设计模式,它使接口不兼容的对象能够协作。适配器充当两个不兼容接口之间的桥梁。
- 目的:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 适配器模式的实现方式
在Java中,我们主要通过组合或聚合的方式,在适配器内部包含一个对适配者的引用。
代码案例
// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;// 构造函数注入适配者public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void do() {adaptee.does();}
}
talk is cheap, show you my code
我们通过代码构造充电头那个案例。不过我们是让国外的充电实例(充电头)在中国能使用。
// 国外充电接口
interface ForeignCharge {void charge(double time);
}// 国内充电接口
interface ChinaCharge {void chongDian(double time);
}// 国外充电接口的实现
class ForeignChargeImpl implements ForeignCharge {@Overridepublic void charge(double time) {System.out.println("charging " + time + " hours");}
}// 适配器类
class ChargeAdapter implements ChinaCharge {private final ForeignCharge foreignCharge;public ChargeAdapter(ForeignCharge foreignCharge) {this.foreignCharge = foreignCharge;}@Overridepublic void chongDian(double time) {// 调用国外充电方法foreignCharge.charge(time);}
}// 客户端代码
public class Test1 {public static void main(String[] args) {// 创建国外充电实例ForeignCharge foreignCharge = new ForeignChargeImpl();// 创建适配器实例ChargeAdapter adapter = new ChargeAdapter(foreignCharge);// 使用适配器调用国外充电实例adapter.chongDian(1.00);}
}
代码详解
ForeignCharge 接口
- 作用:定义了一个国外使用的充电接口。
- 方法:charge(double time) - 表示充电的时间。
ChinaCharge 接口
- 作用:定义了一个国内使用的充电接口。
- 方法:chongDian(double time) - 表示充电的时间。
ForeignChargeImpl 类实现ForeignCharge 接口方法
ChargeAdapter 类
- 作用:适配器类,实现了 ChinaCharge 接口,并持有一个 ForeignCharge 对象。
- 构造方法:ChargeAdapter(ForeignCharge foreignCharge):接受一个 ForeignCharge 对象并存储在 foreignCharge 成员变量中。
- 方法:chongDian(double time):调用 foreignCharge 的 charge 方法来完成充电操作。
客户端类步骤详解
- 创建一个 ForeignChargeImpl 实例,表示国外的充电设备。
- 创建一个 ChargeAdapter 实例,并将 ForeignChargeImpl 实例传递给适配器。
- 通过适配器调用 chongDian 方法,实际执行的是 ForeignChargeImpl 的 charge 方法。
总结
- 适配器模式的过程中一般涉及三个角色:
- Target 目标
- Adaptee 被适配者
- Adapter 适配者
- 适配器模式的优点:
- 提高代码复用性
- 增加灵活性,因为我们可以灵活选择要适配的对象
- 降低耦合, 适配者变化的时候,我们只需要修改适配器代码,客户端可以正常使用
- 适配器模式应用场景:
- 遗留系统集成:当你有一个新的系统需要与旧系统中的某些类交互时,可以使用适配器模式来解决接口不匹配的问题。
- 第三方库集成:当你想使用第三方库中的类,但这些类的接口不符合你的需求时,适配器模式可以帮助你进行转换。
- API 升级:在升级 API 或更换框架时,适配器模式可以帮助平滑过渡,确保现有代码继续正常工作。
适配器模式是一种非常实用的设计模式,特别是在需要整合现有代码或第三方库时。理解如何正确使用适配器模式可以帮助开发者更有效地组织代码并优化程序设计。
相关文章:
带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 适配器模式适配器模式(Adapter Pattern)概述talk is cheap, show you my code总结 适配器模式 适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计…...
破解海外业务困局:新加坡服务器托管与跨境组网策略
在当今全球化商业蓬勃发展的浪潮之下,众多企业将目光投向海外市场,力求拓展业务版图、抢占发展先机。而新加坡,凭借其卓越的地理位置、强劲的经济发展态势以及高度国际化的营商环境,已然成为企业海外布局的热门之选。此时…...
Mybatis-Plus快速入门
参考:黑马MyBatisPlus教程全套视频教程,快速精通mybatisplus框架 1.Mapper-plus配置 1.MapperScan("Mapper目录的位置") 2.Mapper层文件需要继承BaseMapper extends BaseMapper<实体类> 3.开启日志 4.配置类 Configuration public cl…...
Chrome被360导航篡改了怎么改回来?
一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步:…...
Coding(Jenkinsfile)+ Docker 自动化部署 Springboot —— 图文细节和一些注意事项说明
前言:本章讲述一下我使用Coding(Jenkinsfile) Docker部署Springboot项目过程,记录图文细节和一些需要注意的问题。 说明:为什么要使用Coding去集成Docker? 节约了服务器内存,不需要单独部署 Jen…...
docker django uwsgi 报错记录
这个配置中是能够正常进行网页访问的,能够查看网页 [uwsgi] chdir /home/luichun/lc/Pyfile/PyCursor/app module app.wsgi:application plugin-dir /usr/lib/uwsgi/plugins plugins python311 env TZAsia/Shanghai socket-timeout 60 websocket-ma…...
数据分析思维(五):分析方法——假设检验分析方法
数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...
【ES6复习笔记】集合Set(13)
ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。 集合的属性和方法 size:返回集合的元素个数。add…...
基础爬虫案例实战
我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节,我们就来实现一个完整的网站爬虫,把前面学习的知识点串联起来,同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…...
深度学习工作:从追求 SoTA 到揭示新现象
TLDR:主要讨论了从追求模型 SoTA 到揭示新现象的转变。通过几个例子,包括ACNet到RepVGG的发展,RIFE插帧、Film插帧,以及OpenAI的近期工作,阐述了这种转变的重要性。 知乎:黄哲威 hzwer链接:http…...
学习记录—正则表达式-基本语法
正则表达式简介-《菜鸟教程》 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 本期内容将介绍普通字符,特殊…...
智慧农业物联网传感器:开启农业新时代
在当今科技飞速发展的时代,农业领域正经历着一场前所未有的变革,而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”,悄然渗透到农业生产的各个环节,为传统农业注入了全新的活力,让农业生产…...
普通人怎么入门学习并使用AI?
前言 作为普通人看着AI一天一天变革,心急如焚,未来但是就是不知道怎么才算真正进入了AI,使用AI....作为从头至尾追随AI脚步的码农有几点小建议~ 一、💻使用 AI 网站或软件,解决实际问题 不管用哪种AI,先用…...
Java中处理if-else的几种高级方法
前言 在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章,可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…...
前端知识补充—CSS
CSS介绍 什么是CSS CSS(Cascading Style Sheet),层叠样式表, ⽤于控制⻚⾯的样式 CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯的样式和结构分离 基本语法规范 选择器 {⼀条/N条声明} 1)选择器决定针对谁修改…...
企业架构学习笔记-数字化转型
1. 企业数字化发展阶段 案例1.业务部门“点菜”,IT部门叫苦 随着企业信息化进程的不断推进,IT部门的角色和面临的挑战也在发生显著变化。在信息化建设的初级阶段,确实存在IT部门需要积极引导和说服业务部门重视信息技术价值的情况。当时&am…...
Linux网络——TCP的运用
系列文章目录 文章目录 系列文章目录一、服务端实现1.1 创建套接字socket1.2 指定网络接口并bind2.3 设置监听状态listen2.4 获取新链接accept2.5 接收数据并处理(服务)2.6 整体代码 二、客户端实现2.1 创建套接字socket2.2 指定网络接口2.3 发起链接con…...
Vue3之状态管理Vuex
Vuex作为Vue.js的官方状态管理库,在大型或复杂的前端项目中扮演着至关重要的角色。本文将从Vuex的原理、特点、应用场景等多个方面进行深入解析,并通过代码示例展示如何在Vuex中实现特定功能。 一、Vuex原理 Vuex是一个专为Vue.js应用程序开发的状态管…...
DPO(Direct Preference Optimization)算法解释:中英双语
中文版 DPO paper: https://arxiv.org/pdf/2305.18290 DPO 算法详解:从理论到实现 1. 什么是 DPO? DPO(Direct Preference Optimization)是一种直接基于人类偏好进行优化的算法,旨在解决从人类偏好数据中训练出表现…...
Hostapd2.11解析笔记
最近在调试Hostapd,尝试通过配置使能一个支持MLO的AP,不过不知道hostapd conf里面哪些选项开启后可以使能,所以对Hostapd做一个整体解析. 简介 hostapd 是用于接入点和身份验证服务器的用户空间守护程序。它实现 IEEE 802.11 接入点管理、IEEE 802.1X/WPA/WPA2/WPA3/EAP 身份…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
