设计模式学习之——适配器模式

pikachu靶场: 暴力破解第四关(token防爆破) Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。 阅读详情

适配器模式(Adapter Pattern),又称作变压器模式(因为这两者都体现了“转换”或“适配”的核心概念),是一种结构型设计模式。它将一个类的接口转换成客户端所期望的另一种接口,从而使得原本因接口不匹配而无法协同工作的两个类能够一起工作。

一、工作原理

适配器模式的工作原理是通过创建一个适配器类,该类包含一个源接口和一个目标接口。适配器类将客户端请求转换为源接口可以理解的命令,并执行相应的操作。这样,客户端只需要与适配器交互,而不需要直接与源接口交互,从而实现了接口的转换和适配。

二、主要角色

  • 目标接口(Target):定义客户端使用的接口,也就是客户端期望的接口。
  • 适配器(Adapter):实现目标接口,并持有一个源接口的引用,用于将客户端的请求转换成对源接口的调用。
  • 源接口(Adaptee):需要被适配的接口,即系统中已经存在的、但接口与目标接口不兼容的类。
  • 客户端(Client):使用目标接口来调用适配器的方法,从而间接调用源接口的方法。

三、实现方式

适配器模式有两种主要的实现方式:对象适配器和类适配器。

  • 对象适配器:

    • 符合组合复用原则,使用了委托机制。
    • 在适配器类中维护一个被适配者(源接口)的成员变量,通过该成员变量调用被适配者的方法。
  • 类适配器:

    • 通过类的继承关系实现适配器模式。
    • 适配器类继承被适配者类,通过super关键字调用被适配者的方法。

(注:在实际开发中,推荐使用对象适配器模式,因为组合通常比继承更加灵活,且更符合开闭原则。)

四、适用场景

  • 功能正确但接口不匹配:对于之前开发好的类,其操作和返回值都是正确的,但其定义的方法接口无法调用。此时可以使用适配器模式,使该类与用户的接口匹配,让用户使用适配器的接口,间接调用该类。
  • 软件维护阶段:在软件维护时,出现操作和返回值类似但函数接口不同的情况,为了适配第三方系统的接口,可以使用适配器模式。
  • 多个类的接口统一:当系统中的多个类的接口不统一时,可以使用适配器模式将它们的接口统一成一个接口,使这些类能够协同工作,提高系统的灵活性和可扩展性。

五、优缺点

  • 优点:

    • 提高代码的复用性和灵活性:通过适配器模式,可以让原本不兼容的接口协同工作。
    • 降低耦合:目标类和现有类(被适配者)解除耦合,降低了系统的耦合性,易于扩展和维护。
    • 符合开闭原则:如果需要修改或扩展功能,只需要修改适配器类即可,目标类和现有类各自独立,互不影响。
  • 缺点:

    • 增加代码的复杂度和维护成本:适配器模式需要增加一个额外的适配器类,增加了代码的量。如果设计不当,可能会导致适配器类的滥用,增加代码的混乱程度。
    • 降低可读性:系统代码可读性可能会降低,因为调用系统接口时,如果调用的是适配器接口,还需要查找调用的是哪个现有类的实际接口。

六、代码示例

示例一:电压适配器

假设我们有一个输出220V电压的设备(Voltage220V类),但我们有一个只能接受5V电压的设备(如手机,Phone类)。此时,我们可以使用适配器模式来创建一个电压适配器(VoltageAdapter类)。

// 被适配类:表示输出220V电压的设备
public class Voltage220V {
    public int output220V() {
        int src = 220;
        System.out.println("电压=" + src + "伏");
        return src;
    }
}

// 适配接口:表示需要适配到的5V电压接口
public interface IVoltage5V {
    int output5V();
}

// 适配器类:将220V电压适配为5V电压
public class VoltageAdapter implements IVoltage5V {
    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int srcV = voltage220V.output220V(); // 获取220V电压
        int dstV = srcV / 44; // 转换为5V电压(这里仅为示例,实际转换可能更复杂)
        return dstV;
    }
}

// 客户端类:表示只能接受5V电压的设备,如手机
public class Phone {
    // 充电方法,接受5V电压接口
    public void charging(IVoltage5V iVoltage5V) {
        if (iVoltage5V.output5V() == 5) {
            System.out.println("电压为5v,可以充电");
        } else if (iVoltage5V.output5V() > 5) {
            System.out.println("电压大于5v,无法充电");
        }
    }
}

// 客户端测试代码
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Voltage220V voltage220V = new Voltage220V();
        VoltageAdapter voltageAdapter = new VoltageAdapter(voltage220V);
        phone.charging(voltageAdapter); // 通过适配器为手机充电
    }
}

在这个示例中,VoltageAdapter类作为适配器,将Voltage220V类的220V电压输出转换为5V电压输出,从而满足了Phone类的充电需求。

示例二:三相插座与两相插座的适配器

假设我们有一个三相插座(ThreeElectricOutlet接口)和一个两相插座(TwoElectricOutlet接口),以及一个只能插入两相插座的电视机(Tv类)。此时,我们可以使用适配器模式来创建一个三相到两相的插座适配器(TreeElecricAdapter类)。

// 三相插座接口
public interface ThreeElectricOutlet {
    void connectElectricCurrent();
}

// 两相插座接口
public interface TwoElectricOutlet {
    void connectElectricCurrent();
}

// 电视机类,实现了两相插座接口
public class Tv implements TwoElectricOutlet {
    private String name;

    public Tv() {
        name = "电视机";
    }

    public Tv(String name) {
        this.name = name;
    }

    @Override
    public void connectElectricCurrent() {
        System.out.println(name + "开始播放节目");
    }
}

// 三相到两相的插座适配器
public class TreeElecricAdapter implements ThreeElectricOutlet {
    TwoElectricOutlet outlet;

    public TreeElecricAdapter(TwoElectricOutlet teo) {
        this.outlet = teo;
    }

    @Override
    public void connectElectricCurrent() {
        outlet.connectElectricCurrent();
    }
}

// 客户端测试代码
public class TestActivity {
    public static void main(String[] args) {
        ThreeElectricOutlet outlet;
        Tv tv = new Tv("长虹电视机");
        TreeElecricAdapter adapter = new TreeElecricAdapter(tv);
        outlet = adapter;
        outlet.connectElectricCurrent(); // 通过适配器为电视机供电
    }
}

题外:适配器模式为什么又被称为变压器模式

适配器模式(Adapter Pattern)之所以又被称为变压器模式,是因为这两者都体现了“转换”或“适配”的核心概念。以下是对这一命名由来的详细解释:

1、功能上的相似性
  • 适配器模式:

    • 主要解决的是接口不匹配的问题。
    • 通过适配器类,将一个类的接口转换成客户端所期望的另一种接口,从而使得原本因接口不匹配而不能一起工作的两个类能够一起工作。
  • 变压器:

    • 在电力系统中,变压器的主要功能是将一种电压等级的电能转换成另一种电压等级的电能。
    • 通过变换电压,使得不同电压等级的电力系统能够相互连接和传输电能。

从功能上来看,适配器模式和变压器都起到了“转换”或“适配”的作用,使得原本不兼容的双方能够协同工作。

2、命名上的直观性
  • 适配器:

    • 这个名称直接描述了该模式的主要功能,即适配或转换接口。
    • 在计算机领域中,适配器通常用于连接不同规格或类型的设备,使它们能够相互通信或协同工作。
  • 变压器:

    • 这个名称同样直观地描述了其转换电压的功能。
    • 在电力系统中,变压器是不可或缺的转换设备。

将适配器模式命名为“变压器模式”,可以直观地反映出该模式在接口转换方面的作用,使得理解和记忆都更加方便。

综上所述,适配器模式是一种非常有用的设计模式,它能够在不修改现有类的基础上,实现接口的转换和适配,从而提高代码的复用性和灵活性。然而,在使用适配器模式时,也需要注意其可能带来的复杂度和维护成本问题。

山羚羊优化算法(MGO)详解:从自然智慧到优化引擎 山羚羊优化算法(MGO)是一种新型元启发式算法,灵感来源于山羚羊的社会行为和等级制度。该算法模拟了四种核心行为:领地独居雄性(局部开发)、母系山瞪羚群(群体协作)、单身雄性山瞪羚(全局探索)和迁徙觅食(动态扰动)。MGO通过数学建模将这些生物行为转化为优化机制,在探索与开发间实现平衡。算法已成功应用于函数优化、无人机路径规划和支持向量机优化等领域,展现出优异的性能。未来研究将聚焦于参数自适应调整、混合算法设计等方向,以进一步提升算法性能。 阅读详情

相关推荐

节卡Jaka Zu APP编程避坑指南:从频繁通讯错误到稳定Socket交互的调试心得

本文详细解析了节卡Jaka Zu APP编程中常见的通讯错误问题,并提供了从基础排查到高级调试的完整解决方案。通过优化网络配置、固件匹配、心跳机制和数据交互规范,开发者可实现稳定的Socket通讯,有效提升工业机器人操控的可靠性。文章特别针对v1.6.7.3版本的典型问题给出了实用调试技巧。

weixin_42639633的博客 325

适配器模式(Adapter Pattern)

一、定义 适配器模式(Adapter Pattern):结构型模式之一,将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 二、UML类图 三、角色职责 目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。 源角色(Adaptee):你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。 适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器

奶油芝士蘑菇汤的博客 2万+

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4629

设计模式第9讲——适配器模式(Adapter)

适配器模式是一种结构型设计模式,它允许将不兼容的对象转换成可兼容的接口。主要目的是解决在不改变现有代码的情况下,使不兼容的接口之间能够正常工作,通过创建一个中间转换的适配器来将一个对象转换成我们所需要的接口。当我们去国外旅游时,我们可能只会汉语,而当地人只会英语,那么这个时候就需要一个翻译员(翻译软件)来帮助我们。这就类似于适配器模式,通过一个适配器将一个不兼容的接口转成另外一个接口。下面以翻译为例,介绍一下类、接口、对象适配器。

让~学习~成为一种习惯(橡 皮 人の技术博客) 3万+

Ubuntu安装opencv4.5(自己安装过程详细)

1.下载opencv 在opencv官网下载source版,下载链接 http://opencv.org/releases.html。别下载错版本 下载过程就不多说了。 2.安装过程 2.1解压 unzip opencv-4.5.0.zip cd opencv-4.5.0 2.2安装依赖的库 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-

weixin_45629790的博客 1万+

2.6 SST的核心性能指标体系

本文构建了固态变压器(SST)的核心性能指标体系,涵盖电气性能、可靠性、经济性和环境适配性四大类指标。电气性能指标包括运行效率(≥97%)、功率密度(≥900kVA/m³)、谐波畸变率(≤3%)等关键参数;可靠性指标设定MTBF≥43800h、年均故障率≤1.2次/年等标准;经济性指标对比分析了初始购置成本(45-55万元)和全生命周期成本(48-55万元);环境适配性指标则明确了温度、海拔等工况要求。该体系采用量化公式和国标限值,为SST的性能测试、选型和优化提供了统一标准。

技术工作者 602

设计模式之适配器模式详解

设计模式之适配器模式详解 文章目录设计模式之适配器模式详解一、什么是适配器模式二、适配器模式的角色组成三、适配器模式应用场景四、适配器模式--类适配器示例五、适配器模式--对象适配器示例六、适配器模式--接口适配器示例七、适配器模式优缺点 一、什么是适配器模式 适配器模式(Adapter Pattern) 也称为变压器模式 ,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式其实起着转化、委托的作用,将一种接

weixin_45538589的博客 4192

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 214

设计模式-适配器模式(Adapter)

适配器模式(Adapter Pattern)是一种结构型设计模式,它主要用于解决两个不兼容的接口之间的问题。这种模式通过结合两个独立接口的功能,使原本不能一起工作的那些类可以一起工作。适配器模式涉及到一个单一的类,这个类负责将独立的或不兼容的接口功能整合到一起。举个例子,读卡器就是作为内存卡和笔记本之间的适配器。我们先把内存卡插入读卡器,再把读卡器插入笔记本,然后就可以通过笔记本来读取内存卡的内容了。

miaoyl的博客 5712

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6181

在 Visual Studio Code 中开发 SAP Fiori 应用并部署到 Cloud Foundry 的完整实战指南

摘要:本文介绍如何以ABAP RAP服务为后端,通过VS Code和SAP Fiori工具将Fiori应用一键部署到SAP BTP Cloud Foundry环境。主要内容包括:1) 开发环境配置(VS Code+Fiori工具);2) 架构流程说明(MTA打包、Approuter路由);3) 权限准备(业务Catalog分配);4) 创建带Approuter的MTA项目;5) 连接ABAP OData服务并生成Fiori应用。文中还针对常见问题(如服务不可见、部署失败)提供了解决方案参考。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 367

23种设计模式:适配器模式(最强解析!!!)

适配器模式是23种设计模式之一。 适配器模式作用 适配器模式的作用,在于将一个类的接口变换为客户端所期待的另一种接口,使得原本因为接口不匹配而无法一起工作的两个类能在一起工作。 也就是说,适配器模式解决的是接口兼容性问题。 适配器模式实现方式 适配器模式依据实现方式的不同,可以划分为3种:类适配器、对象适配器和接口适配器。 (一)类适配器 类适配器类图如下: 类适配器主要由三部分构成: Target:目标角色,也即被转换后的接口; Adaptee:源角色,需要被转换的接口; Ad.

进击的Coder*的博客 4716

手把手教你RK3588 NPU驱动与RKNN Toolkit,AI开发不迷路!

本文详细介绍了RK3588 NPU驱动安装与RKNNToolkit使用方法。首先阐述了RK3588芯片在嵌入式AI领域的优势,包括6TOPS算力和混合量化支持。随后分步骤讲解了NPU驱动安装流程,包括准备工作、编译安装、验证调试及常见问题解决。接着全面介绍了RKNNToolkit的环境搭建、基本使用流程和图像分类实战案例,涵盖模型转换、推理优化等关键环节。最后展望了RK3588在智能安防、工业自动化等领域的应用前景,为开发者提供了完整的嵌入式AI开发指南。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 433

设计模式 - 学习笔记 - 适配器模式AdapterPattern

设计模式 - 学习笔记 - 适配器模式原理分析代码演示电源插座 ElectricalSocket两口插头 PlugUSB公口手机充电器(适配器) ChargerAdapter客户端 AdapterPatternDemo 原理分析 适配器就是:扩展坞、转换器、充电头。 解决的问题就是将一个目标不支持的接口,转变成一个能用的接口。 典型场景就是功能都具备,只是接口对不上。 代码演示 电源插座 ElectricalSocket public class ElectricalSocket{ public vo

灵台方寸山斜月三星洞 606

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式学习—适配器模式(Adapter Design Pattern)

适配器模式的学习

闲鱼的博客 710

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

认真学习设计模式之适配器模式(Adapter Pattern)/包装器模式

适配器的作用可以简单通过下图得知,OO适配器就是将一个接口转换成另一个接口,以符合客户的期望。 实际场景应用可以联想插座适配器,如下图所示。 客户使用适配器的过程如下: ① 客户通过目标接口调用适配器的方法对适配器发出请求; ② 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口; ③ 客户接受到调用的结果,但并未察觉这一切是适配器在其转换作用。 ...

小小默:进无止境 2374

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

学习设计模式之适配器模式,但是宝可梦

作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。

pocket_eight的博客 1000

设计模式学习笔记十一:适配器模式(Adapter Pattern)

设计模式学习笔记十一:适配器模式(Adapter Pattern)     1.概述     在软件开发中,我们经常会遇到系统间集成,在系统集成时,最常见的问题就是系统间的接口不一致。很多能够满足功能的系统模块,由于接口不一致,导致无法使用。例如,常用的媒体播放器是MS Media player和RealPlayer,他们的文件结构和软件接口完全不同,前者支持WMF格式的音频和

AlbenXie的博客 336

学习笔记【23种设计模式-第六节:Adapter Pattern适配器模式】

Adapter Pattern适配器模式 简述: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。 适配器模式属于构造型模式。 主要分为三类:适配器模式、对象适配器模式、接口适配器模式。 工作原理 适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。 从用户的角度看不到被适配者,是解耦的。 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。 用

qq_53273362的博客 156

学习设计模式《三》——适配器模式

  适配器模式的本质是【转换匹配,复用功能】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1199

设计模式学习--适配器模式(Adapter Pattern)+外观模式(Facade Pattern)

设计模式学习--适配器模式(Adapter Pattern)+外观模式(Facade Pattern) 2013年6月21日 设计模式学习 今天要学习两个设计模式:适配器模式、外观模式 还是老方式,回顾以往的知识 面向对象基础 抽象封装多态继承 面向对象原则 封装变化多用组合,少用继承针对接口编程,不针对实现编程为交互对象之间的松耦合

巫山老妖 3181

HeadFirst 设计模式学习笔记7--适配器模式和外观模式

本文已搬家至【HeadFirst 设计模式学习笔记】7 适配器模式和外观模式

gnuhpc的专栏 2421

C#设计模式学习笔记:(6)适配器模式

本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用。 一、引言 从今天开始我们开始讲结构型设计模式,结构型设计模式有如下几种:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 创建型设计模式解决的是对象创建的问题,而结构型设计模式解决的是类和对象组合关系的问题。 今天我们开始讲结构型设计模式里面的第一个设计模式:适配器模式。适配器模式其实很简单,在现实生活中有很多这样的实例实例:比如,手机充电

chinaherolts2008的博客 184

设计模式学习笔记(七)- --适配器模式

[同系列文章] 1. 设计模式学习笔记(一)- -策略模式 2. 设计模式学习笔记(二)- -观察者模式 3. 设计模式学习笔记(三)- –装饰者模式 4. 设计模式学习笔记(四)- –工厂模式 5. 设计模式学习笔记(五)- –单件模式 6. 设计模式学习笔记(六)- –命令模式相信大家学了这么久,对设计模式都很有感觉了吧,各种封装大法,各种先进成熟可靠的思想有没有吸引住你呢?本

hecate1994的博客 309
上一篇: 设计模式学习之——工厂模式
下一篇: 设计模式学习之——装饰者模式
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值