带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)

  • 适配器模式
    • 适配器模式(Adapter Pattern)概述
    • talk is cheap, show you my code
    • 总结

适配器模式

适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计模式。它允许不兼容的接口协同工作,通过创建一个适配器类来转换某个类的接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

ok,概念还是太抽象了。来个例子就生动一点。

我们举个手机充电的例子,我们充电头适配的是国内的电网。可是我们国家的电网工作电压与频率不一定与国外的一样,如果我们需要去国外生活或者旅游,怎么办呢? 首先下面我们展示两种充电插头,一种是国标的,另一种是国外的。
在这里插入图片描述
在这里插入图片描述

我们会怎么办呢? 一般来说,我们会买一个充电转换头
在这里插入图片描述
这样的话,我们的充电器就可以在国外正常使用了。其实这样一种实现,就是适配器模式(Adapter Pattern)的体现。

适配器模式(Adapter Pattern)概述

  1. 适配器模式定义与目的
  • 定义:适配器模式是一种结构型设计模式,它使接口不兼容的对象能够协作。适配器充当两个不兼容接口之间的桥梁。
  • 目的:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  1. 适配器模式的实现方式
    在Java中,我们主要通过组合或聚合的方式,在适配器内部包含一个对适配者的引用。

代码案例

// 对象适配器
class ObjectAdapter implements Target {
    private Adaptee adaptee;

    // 构造函数注入适配者
    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public 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 {
    @Override
    public 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;
    }

    @Override
    public 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 方法来完成充电操作。

客户端类步骤详解

  1. 创建一个 ForeignChargeImpl 实例,表示国外的充电设备。
  2. 创建一个 ChargeAdapter 实例,并将 ForeignChargeImpl 实例传递给适配器。
  3. 通过适配器调用 chongDian 方法,实际执行的是 ForeignChargeImpl 的 charge 方法。

总结

  1. 适配器模式的过程中一般涉及三个角色:
    1. Target 目标
    2. Adaptee 被适配者
    3. Adapter 适配者
  2. 适配器模式的优点:
  • 提高代码复用性
  • 增加灵活性,因为我们可以灵活选择要适配的对象
  • 降低耦合, 适配者变化的时候,我们只需要修改适配器代码,客户端可以正常使用
  1. 适配器模式应用场景:
  • 遗留系统集成:当你有一个新的系统需要与旧系统中的某些类交互时,可以使用适配器模式来解决接口不匹配的问题。
  • 第三方库集成:当你想使用第三方库中的类,但这些类的接口不符合你的需求时,适配器模式可以帮助你进行转换。
  • API 升级:在升级 API 或更换框架时,适配器模式可以帮助平滑过渡,确保现有代码继续正常工作。

适配器模式是一种非常实用的设计模式,特别是在需要整合现有代码或第三方库时。理解如何正确使用适配器模式可以帮助开发者更有效地组织代码并优化程序设计。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技术实战】R语言统计分析与可视化从入门到精通

前言 随着大数据时代的到来,数据分析已经成为各行各业的重要技能。R语言作为一种强大的统计分析和数据可视化工具,广泛应用于科学研究、数据分析和商业决策支持。 本文将带领读者从入门到精通,掌握R语言在统计分析和数据可视化方面的核心技…

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…

【运维】文件存储公共盘升级及数据迁移

记录一下升级公共盘及数据迁移的经历 一、背景: 因旧公共盘性能较差,故公司打算采购一批主机,用于替换旧的公共盘。 二、迁移计划: 选择了用户使用较少的星期五晚上到星期日晚上作为迁移时间窗口,同时选择了fastco…

消息队列(一)消息队列的工作流程

什么是消息队列 首先,代入一个场景,我现在做一个多系统的集成,分别有系统A、B、C、D四个系统,A系统因为使用产生了业务数据,B、C、D需要使用这些数据做相关的业务处理和运算,最基本的做法就是通过接口通信…

SAP配置网络打印机

1、网络打印机 在项目中需要用打印机打印表单,如果不配置网络打印机,通常需要通过连接特定的计算机(如打印服务器)来进行打印,或者使用本地连接的打印机,这样每台计算机可能需要单独配置打印机或安装驱动&…

GB/T34944-2017 《Java语言源代码漏洞测试规范》解读——安全功能

GB/T34944-2017 《Java语言源代码漏洞测试规范》标准是软件测试实验室开展代码测试活动的重要依据,也是软件测试实验室申请代码测试CNAS/CMA实验室认证时所依据的标准方法。本系列文章一起解读GB/T34944-2017 《Java语言源代码漏洞测试规范》,前面的文章…

NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法,如果提升 100W 倍的性能? NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊! 一个提升英文单词拼…

监听器listener

文章目录 监听器( listener)对Application内置对象监听的语法和配置对session内置对象监听的语法和配置 监听器( listener) 对象与对象的关系: 继承关联 tomcat一启动创建的顺序:监听器,config,application(全局初始化参数)&am…

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计,通过优化硬件组成和软件设计,实现高效率和高准确度的检定工作,有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”

1. 异常描述 在linux系统中使用jdbc访问sqlite数据库时出现如下错误提示: 2. 异常分析 可能是当前使用版本的sqlite-jdbc-xxx.jar版本有bug。 3. 异常解决 我是从3.8.9.1版本换到了3.16.1版本就好了。

Java(Sprigboot) 项目调用第三方 WebService 接口实现方式

文章目录 Java(Sprigboot) 项目调用第三方 WebService 接口实现方式WebService 简介业务场景描述WSDL 文档请求地址及方式接口请求/响应报文 代码实现1、接口请求/响应报文 JSON 准备(1)TransData(2)BaseInfo、InputData、OutputD…

基础爬虫案例实战

我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节,我们就来实现一个完整的网站爬虫,把前面学习的知识点串联起来,同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告:HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…

C++-----线性结构

C线性结构模板 概念:线性结构是一种数据元素之间存在一对一线性关系的数据结构,如数组、链表、栈、队列等。C中的模板可以让我们编写通用的代码,适用于不同的数据类型,而不必为每种数据类型都重复编写相同的代码结构。作用&#…

六大基础深度神经网络之CNN

左侧是传统卷积网络输入的是一列像素点,右侧是卷积神经网络,输入的是具有长宽通道数的原始图像 下图为整体架构。卷积层可以认为提取特征,池化层是压缩特征。全连接层是把图像展平然后计算10个类别的概率值 给出一张图像不同区域的特征不同&a…

AIOps平台的功能对比:如何选择适合的解决方案?

定义与概念 AIOps,即人工智能运维(Artificial Intelligence for IT Operations),是将人工智能技术应用于 IT 运维领域,以实现自动化、智能化的运维管理。它通过整合大数据、机器学习等先进技术,对海量运维数…

pr基础(3)-lumetri

这篇应该是基础的完结篇了,主要记录调色方面的相关知识。 主要的内容是lumetri的使用 Lumetri的翻译其实来源于两个部分的组合。"Lume"这个词源于拉丁语,意为明亮度或光亮度,是Luminance (Luma) 的缩写,强调了光线的强…

【 thefuck 安装与使用】Linux 终端自动纠错工具:一头GitHub上的“草泥马“ - thefuck,妈妈再也不用担心我打错命令行了!

目录 快速安装使用 . 1.简介 2.安装 3.配置 4.补充 官方盗料参考 快速安装使用 快速安装使用,四步即可: #Ubuntu/Debian系统 sudo apt update sudo apt install python3-dev python3-pip sudo pip3 install thefuck #编辑bashrc配置文件 vim ~/.bashrc…

基于pytorch的深度学习基础3——模型创建与nn.Module

三 模型创建与nn.Module 3.1 nn.Module 模型构建两要素: 构建子模块——__init()__拼接子模块——forward() 一个module可以有多个module; 一个module相当于一个运算,都必须实现forward函数; 每一个mod…

智慧农业物联网传感器:开启农业新时代

在当今科技飞速发展的时代,农业领域正经历着一场前所未有的变革,而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”,悄然渗透到农业生产的各个环节,为传统农业注入了全新的活力,让农业生产…