设计模式之适配器模式

设计模式|适配器模式(Adapter Pattern) 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于解决两个已有接口之间不兼容的情况。适配器模式使得不兼容的接口能够协同工作,而无需修改已有的代码。这对于集成已有代码库或者第三方组件时非常有用,因为它可以帮助在不破坏现有接口的情况下实现必要的功能补充。 阅读详情

什么是适配器模式

    适配器模式是将一个接口转换成客户希望的另一个接口,使得一个类的接口和另一个类的接口匹配起来,无需修改原来的接口内容。
    在适配器模式中,我们通过增加一个新的适配器类来解决接口兼容问题。使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器。在对象适配器模式中,适配器和适配者之间是关联关系;在类适配器模式中,适配器和适配者之间是继承或实现关系。实际开发中对象适配器的适用频率更高。
    对象适配器模式包含以下几个角色:
        Target(目标抽象类):定义客户需要的接口,可以是抽象类或接口也可以是具体类。
        Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器模式中通过继承Target并关联一个Adaptee对象进行关联。
        Adaptee(适配者类):适配者即被适配的对象,定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了具体的业务方法。

适配器模式的优缺点

优点
  1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原代码。
  2. 将具体业务实现封装在适配者类中,增加了类的复用性,对客户端是透明的。
  3. 一个对象适配器可以把多个不同的适配者适配到同一个目标。
  4. 可以适配一个适配者的子类,由于适配器和适配者是关联关系,根据里氏替换原则适配者的子类也可以通过该适配器进行适配。

类适配器模式还有一个优点,由于适配器类是适配者类的子类,因此可以在适配器类中修改一些适配者的方法,是的适配器更加灵活。

缺点
类适配器模式缺点
  1. 对于java,C#等不支持多继承的语言,一次最多只能适配一个适配者类。
  2. 对于java,C#等语言中,目标抽象类只能为接口,不能为类,使用有一定的局限性。
  3. 适配者类不能为final修饰。
对象适配器模式缺点
  1. 与类适配器相比,如果想要在适配器中修改适配者类中的方法必须替换适配者类的方法。

适配器模式的应用场景

  1. 系统需要使用一些现有的类,而这些类的接口不符合现有需求。
  2. 想新建一个可以重复使用的类,用于与其他没有关联的类一起工作。

适配器模式的案例


// 目标接口(抽象类)
public interface IVoltage5V {

    int output5V();

}

// 适配者类
public class Voltage220V {

    public int output220V() {
        int src = 220;
        System.out.println("===" + src + "===");
        return src;
    }
}

// 适配器类
public class VoltageAdapter implements IVoltage5V {

    private final Voltage220V voltage220V;

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

    @Override
    public int output5V() {
        int dst = 0;
        if (null != voltage220V) {
            int src = voltage220V.output220V();
            dst = src / 44;
            System.out.println("===" + dst);
        }
        return dst;

    }
}

public class Phone {

    public void charging(IVoltage5V iVoltage5V) {
        if (iVoltage5V.output5V() == 5) {
            System.out.println("5V~~");
        } else if (iVoltage5V.output5V() > 5) {
            System.out.println(">5V~~");
        }
    }
}

public static void main(String[] args) {
	Phone phone = new Phone();
	phone.charging(new VoltageAdapter(new Voltage220V()));
}

在这里插入图片描述

适配器模式在源码中的应用

InputStreamReader

// 目标抽象类
public abstract class Reader implements Readable, Closeable {
    public int read() throws IOException {
        char cb[] = new char[1];
        if (read(cb, 0, 1) == -1)
            return -1;
        else
            return cb[0];
    }
    ......
}

// 适配器类
public class InputStreamReader extends Reader {

    private final StreamDecoder sd;

    /**
     * Creates an InputStreamReader that uses the default charset.
     *
     * @param  in   An InputStream
     */
    public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
        } catch (UnsupportedEncodingException e) {
            // The default encoding should always be available
            throw new Error(e);
        }
    }

    public int read() throws IOException {
        return sd.read();
    }
    ......
}

// 适配者类
public class StreamDecoder extends Reader {
    public int read() throws IOException {
        return this.read0();
    }

    private int read0() throws IOException {
        synchronized(this.lock) {
            if (this.haveLeftoverChar) {
                this.haveLeftoverChar = false;
                return this.leftoverChar;
            } else {
                char[] var2 = new char[2];
                int var3 = this.read(var2, 0, 2);
                switch (var3) {
                    case -1:
                        return -1;
                    case 0:
                    default:
                        assert false : var3;

                        return -1;
                    case 2:
                        this.leftoverChar = var2[1];
                        this.haveLeftoverChar = true;
                    case 1:
                        return var2[0];
                }
            }
        }
    }
    ......
}


实战指南:如何用DCCRN模型提升语音增强效果(附代码示例) 本文提供了基于DCCRN模型进行语音增强的实战指南。通过深入解析复数网络如何协同处理语音的幅度与相位信息,并附有完整的PyTorch代码实现,帮助开发者从数据准备、模型搭建到训练调优,构建高效的实时语音增强系统,有效提升嘈杂环境下的语音清晰度。 阅读详情

相关推荐

【Codex Sandbox 与审批机制:小白也能看懂的实用教程】

这篇教程介绍了Codex工具中的沙盒(Sandbox)和审批(Approvals)机制,帮助用户安全高效地使用Codex协作。沙盒限制Codex访问范围,审批机制则控制敏感操作权限。文章详细讲解了五种常见模式:最安全的安全只读浏览、只读非交互、仓库内编辑、Auto预设和不推荐的YOLO模式。还提供了新手使用路径建议、配置示例和实战场景范式,包括如何测试沙盒行为、不同系统下的实现方式以及常见问题解答。最后附上速查清单,帮助用户快速选择合适的权限组合。

zsr154278963的博客 6705

设计模式结构型——适配器模式

适配器模式(Adapter)其别名为包装器模式(Wrapper),将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。在适配器模式中,通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器、类适配器、接口适配器三种。

tszc95的博客 3200

车载智能终端的设计

本文研究的主要内容是车载智能终端的设计,在学习和借鉴国内外在车载电子领域已有的成熟经验的基础上,利用32位嵌入式处理器S344B0X01和μC/OS-Ⅱ实时操作系统技术,针对汽车行驶记录仪、GPS/GPRS的已有设计的不足提出了新的解决方案,并对方案的可行性进行了分析和论证。

weixin_44553616的博客 1415

设计模式-适配器模式-adapter pattern

类适配器通过继承实现适配,适用于适配者接口较为固定的情况。对象适配器通过组合实现适配,提供了更高的灵活性,可以在运行时动态改变适配者对象。接口适配器通常用于适配多个具有不同接口的适配者,通过实现多个接口来统一调用。在实际开发中,选择哪种适配器模式取决于具体的设计需求和现有的代码结构。

wesigj的博客 1862

ROS2 Nav2实战:解决rviz2显示no map received的3种实用方法(附详细步骤)

本文针对ROS2 Nav2导航栈中rviz2显示“no map received”的常见问题,提供了三种核心解决方案。深入剖析了问题根源在于ROS2生命周期节点管理、QoS策略不匹配及坐标系设置错误,并分别通过手动配置流程、集成生命周期管理器以及调优QoS策略与固化rviz2配置,给出了详细的实战步骤,确保地图数据可靠显示。

j0k1l2m3n的博客 422

Google OR-Tools的CP-SAT求解器,为什么比传统线性规划更适合你的组合优化问题?

本文深入解析Google OR-Tools中的CP-SAT求解器为何比传统线性规划更适合解决组合优化问题。CP-SAT融合约束规划与可满足性理论,原生支持复杂逻辑约束和离散决策,在物流、生产调度等领域展现出显著优势。通过技术对比和实战案例,展示CP-SAT在处理高组合复杂度问题时的卓越性能。

weixin_28700593的博客 922

设计模式——适配器模式

Android设计模式之适配器模式的理解

qq_39431405的博客 1614

MFC界面库BCGControlBar v32.0 - 对话框、仪表盘控件升级

亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFCv32.0正式发布!新版本支持Windows 11、增强功能区简化模式、改进控件外观等,以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGControlBar Pro for MFC v32.0正式版下载 对话框和表单 1. 添加了一个新的全局标志globalData.m_bAutoPrepareComboListStyles:如果您希望.

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1145

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

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

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

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

BioEmu 扩散模型加速传统分子动力学(MD)模拟

BioEmu 是一种创新的生成式深度学习系统,通过高效采样和准确预测蛋白质的动态机制,为蛋白质科学和药物设计提供了新的工具。它在多构象采样、MD 模拟拟合和蛋白质稳定性预测方面表现出色,同时显著降低了计算成本。BioEmu 的开发为未来蛋白质动态研究和应用奠定了坚实基础。

weixin_42357472的博客 320

软件系统设计-7-适配器模式和组合模式

软件系统设计-7-适配器模式和组合模式

SpriCoder的博客 1080

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3484

设计模式之AdapterPattern适配器模式

在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。 通俗来讲,适配器就是一个中转站,把A模型转换为B模型。 适配器模式的定义与特点: 定义如下: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,类结构型模式类之间的耦合

haoyuegongzi的博客 252

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

23种设计模式之适配器模式(Adapter Pattern)

、本篇文章将23种设计模式中的适配器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++设计模式——适配器模式(Adapter Pattern)

C++设计模式——适配器模式(Adapter Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——适配器模式(Adapter Pattern)目录定义定义作用/解决的问题适配器模式中的角色代码示例总结优缺点适用场景参考资料 定义 定义 Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t ot

leonardohaig的博客 1547

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

设计模式教程:适配器模式(Adapter Pattern)

将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类能够一起工作。

遇见伯灵说的博客 1816

【c++设计模式09】结构型1:适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而无法合作的类能够协同工作。

junxuezheng的博客 2051

您的设计模式——适配器模式【Adapter Pattern】

这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?是的,一样的作用,两个不同接口,有不同的实现,但是某一天突然上帝命令你把 B 接口 转换

504

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

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

Bankcary的博客 820

Carson带你学设计模式:适配器模式(Adapter Pattern)

手把手带你全面了解适配器模式

Carson带你学Android 3万+

彻底搞懂设计模式DesignPattern-适配器模式

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

Ping 281

设计模式(DesignPattern)之适配器模式(Adapter)

1、定义         适配器模式简单来说就是将一个接口转换成另一种接口,从而让原本不兼容的接口能够兼容。         从用户的角度感觉不到被适配者,实现了解耦,用户调用适配器转换出来的接口方法,适配器再调用被适配接口的相关方法,被适配的接口对于用户来说是透明,用户也无需关心被适配的接口。 2、使用场景         ① 对于不兼容类型的接口进行转换。         ② 在输入...

inventor1024的博客 387

设计模式:适配器模式(Adapter Pattern)

目录 一、模式含义 适配器模式(Adapter Pattern):  Target(目标抽象类):  Adapter(适配器类): Adaptee(适配者类): 二、模式分类 1.类适配器 2.对象适配器 3.双向适配器 三、示例代码 Target(目标抽象类):  Adapter(适配器类): Adaptee(适配者类): 一、模式含义 适配器模式(Adapter ...

醉花妍 240

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

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

灵台方寸山斜月三星洞 605

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

适配器模式(Adapter Pattern)属于结构型设计模式,它的作用是将一个类的接口转换成客户希望的另外一个接口。适配器让原本由于接口不兼容而不能一起工作的类可以协同工作。

Java_Wxlin的博客 701
上一篇: 设计模式之原型模式
下一篇: 设计模式之桥接模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值