设计模式笔记(7)---适配器模式(结构型)

设计模式之结构型模式 结构型模式 一、适配器模式 (一)定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。 (二)应用实例:读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 (三)构成要素: 二、桥接模式 (一)定义:桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 阅读详情

 

Gof定义

将一个类的接口转换成客户所希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

动机

在软件系统中,由于应用环境的变化,常常要将“一些现存的对象”放在心的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。

适配的意思是在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。在我们的生活中有着很多适配器的例子,笔记本的电源适配器、一些卡的USB读卡器等等。

在Gof23这本书中将适配器模式分成了两种:对象适配器和类适配器

对象适配器

2009-11-19_215129

上图中的Target是客户所期待的,希望去使用的类或接口。Adaptee是被适配的对象。Adapter为适配的对象。首先将上图中的结构还原成代码,如下:

/// <summary>
   /// 客户要使用的类
   /// </summary>
   public abstract  class Target
   {
       public abstract void Request();
   }

   /// <summary>
   /// 被适配的类
   /// </summary>
   public class Adaptee
   {
       public void SpecificRequest()
       { 
           
       }
   }

   /// <summary>
   /// 适配对象
   /// </summary>
   public class Adapter : Target
   {
       private Adaptee adapee = new Adaptee();

       public void Request()
       {
           adapee.SpecificRequest();
       }
   }

   /// <summary>
   /// 客户程序
   /// </summary>
   public class App
   {
       static void Main(string[] args)
       {
           Target target = new Adapter();
           //对客户来说是调用的Request,实际上是调用的SpecificRequest
           target.Request();
       }
   }

接着根据上面的思路来看一个实际例子,我们要来实现一个对栈的操作,有一个IStact接口,里面有三个方法Push(进栈)、Pop(出栈)和GetTopItem(取最顶层元素),这个IStact接口将相当于上面的Target,想要实现进栈出栈的操作,如果自己去实现数据结构显得比较麻烦,在此可以将net提供的ArrayList类拿来一用,ArrayList类就是被适配的对象,相当于上面的Adaptee。在写一个适配类StactAdapter类完成功能就可以了。

/// <summary>
/// 栈的接口
/// </summary>
public interface IStack
{
    void Push(object item);
    void Pop();
    Object GetTopItem();
}
/// <summary>
/// 对象适配器
/// </summary>
public class StactAdapter:IStack
{
    ArrayList list;
    /// <summary>
    /// 构造函数中实例化ArrayList
    /// </summary>
    public StactAdapter()
    {
        list = new ArrayList();
    }
    /// <summary>
    /// 进栈
    /// </summary>
    /// <param name="item">压入栈的元素</param>
    public void Push(object item)
    {
        list.Add(item);
    }
    /// <summary>
    /// 出栈
    /// </summary>
    public void Pop()
    {
        list.RemoveAt(list.Count - 1);
    }
    /// <summary>
    /// 取最顶层的元素
    /// </summary>
    /// <returns></returns>
    public Object GetTopItem()
    {
        return list[list.Count - 1];
    }
}
/// <summary>
/// 客户调用
/// </summary>
public class App
{
    static void Main(string[] args)
    {
        IStack myStack = new StactAdapter();
        myStack.Push("oec2003");
        myStack.Push("oec2004");
        myStack.Push("oec2005");
        myStack.Pop();
        Console.WriteLine(myStack.GetTopItem());
    }
}

Adapter模式理解起来也非常简单,IStact中的Push和Pop方法就是添加元素和移除元素的功能,正好系统类ArrayList中就提供了Add和RemoveAt这样的方法,所以就可以拿来借用,通过适配器类(StactAdapter)的转换使得Push和Pop方法可以支持添加和移除元素的功能,就像我们经常使用的笔记本一样,本来现实中的电压和笔记本所需要的电压不相符,通过电源适配器的转换就将现实中的电压转换成笔记本所需要的电压。

类适配器

2009-11-19_215214

类适配器中使用到了剁成继承,从图中可以看出Adapter继承了Target和Adaptee,而在C#语言中不支持多继承,如果一定要在C#中使用类适配器,那么Target和Adapter其中之一一定要为接口,这样就有了一定的局限性。再者Adapter继承了Target和Adapter后就拥有了这两个的职责,这也违反了单一职责原则,所以通常我们使用对象适配器,下面还是给出配合上图的代码,Target设计成了接口。

/// <summary>
/// 客户要使用的类
/// </summary>
public interface ITarget
{
    public void Request();
}
/// <summary>
/// 被适配的类
/// </summary>
public class Adaptee
{
    public void SpecificRequest()
    {

    }
}
/// <summary>
/// 适配对象
/// </summary>
public class Adapter : Adaptee,ITarget
{
    public void Request()
    {
        this.SpecificRequest();
    }
}
/// <summary>
/// 客户程序
/// </summary>
public class App
{
    static void Main(string[] args)
    {
        ITarget target = new Adapter();
        //对客户来说是调用的Request,实际上是调用的SpecificRequest
        target.Request();
    }
}

Adapter模式的几个要点

Adapter模式主要英语于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移方面非常有用。

Gof23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合。

Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如,完全可以讲Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。

Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期方便适配。

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码) 本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。 阅读详情

相关推荐

Qwen3-Embedding选型指南:0.6B/4B/8B三版本性能对比与场景匹配建议

本文深入解析阿里开源的Qwen3-Embedding系列模型(0.6B/4B/8B)的性能差异与适用场景,提供从边缘计算到云端部署的实战选型建议。通过实测数据对比响应延迟、内存占用和多语言精度等核心指标,帮助技术团队根据业务需求选择最优模型版本,并分享边缘设备优化与云端成本测算策略。

qsc901234567的博客 892

适配器模式--实现queue、stack、priority_queue、反向迭代器

实现queue、stack、priority_queue、反向迭代器

m0_61780496的博客 597

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

【技巧】通过适配器模式完成栈的数据结构

学习了模板,我们发现,c++中的众多数据结构,如栈与队列跟模板,只是方法上与线性表不同,其真正意义上的结构,也就是线性表,代码如下:template<typenameT> classSeqList { private: int_size; int_capacity; T*_data; }; //temp...

weixin_34362875的博客 155

Qt6.5.1+WebRTC学习笔记(十二)环境搭建流媒体服务器(ubuntu22.04+SRS)

若只是实现一对一通信,仅使用webrtc就足够了。但有时间需要进行多个人的直播会议,当人比较多时,建议使用一个流媒体服务器,笔者使用的是SRS。这个开源项目资料比较全,笔者仅在此记录下搭建过程。

aggs1990的专栏 3364

从S参数矩阵到硬件实现:手把手教你用耦合微带线设计Marchand巴伦

本文详细介绍了使用耦合微带线设计Marchand巴伦的完整流程。从奇偶模理论和S参数矩阵分析入手,结合ADS仿真软件进行参数优化与电磁仿真验证,最终指导PCB布局、制作与实测调试。文章以2.4GHz Wi-Fi前端电路为例,手把手演示了从理论计算到硬件实现的全过程,并分享了关键的工程经验与调试技巧。

weixin_29271263的博客 536

适配器模式

适配器模式 * 1.简述:* 适配器模式能够将一个接口转换成一个接口。它能将新的未实现的接口,通过旧的已实现的接口来填充。

白日梦 518

使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播、组播、广播)

PWM调光 1、使用有pwm波输出的引脚,本例子使用timer0,PA0引脚; 2、由于timer时钟的原因,mcu不能进入休眠; 3、主控使用EFM32,代码实现如下: #define MAX_PULSE (CPU_FREQ/1000-1) #define UNIT_PULSE MAX_PULSE/100 //单位脉宽 void pwminit(void) { ...

freemote的博客 2944

适配器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 1.适配器模式 2.抢救适配器 3.解决问题 4.类适配器 5.何时使用适配器模式 6.下载源代码 1.适配器模式 ...

最佳 Java 编程 807

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤)

本文详细解析了Visual Studio调试时ntdll.dll的PDB文件缺失问题,提供了3种实用解决方案:调整调试设置、配置符号服务器与缓存目录、手动下载管理符号文件。通过分步指导和高级技巧,帮助开发者快速恢复完整的调试功能,特别适用于Windows平台下的C++项目开发。

weixin_42537919的博客 513

微信小程序 - 最新将页面可分享到朋友圈功能,小程序实现分享到朋友圈功能,开启分享给好友及分享朋友圈功能(微信小程序怎么分享到朋友圈?详细流程及示例代码教程)

没有设置过分享朋友圈功能的小程序,分享朋友圈按钮是灰色且无法点击。小程序 vue2 | vue3 版本语法都能使用,跟着教程复制代码运行即可。如下图所示,将页面开启分享后便可由用户转发出去。

🏆 前端领域优质创作者 2417

[设计模式笔记]二. 结构型模式--7.Adapter模式(适配器模式)(一)

结构型模式 Adapter模式(适配器模式) 一. 意图 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 二. 适用性 2.1 你想使用一个已经存在的类,而它的接口不符合你的需求。. 2.2 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼

cay22的专栏 1755

在 Linux 64 位上遭遇 Signal 7 与 ST22 SYSTEM_CORE_DUMPED:从 es/implementation=std 到 /dev/shm 的一套落地排查法

摘要: Linux 64位SAP系统出现SYSTEM_CORE_DUMPED和Signal 7(对应SIGBUS)错误时,核心问题是进程因共享内存资源异常被操作系统强制终止。主要诱因包括:1)/dev/shm的tmpfs默认容量不足(通常仅占物理内存50%);2)SAP内存管理参数es/implementation=map在64位场景下的敏感性。解决方案应双管齐下:在实例profile设置es/implementation=std以降低对tmpfs的依赖,同时按(RAM+Swap)*75%重新配置/dev/

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

[设计模式笔记]二. 结构型模式--7.Adapter模式(适配器模式)(二)

场景 有某设备需要这样的功能: 开灯/关灯, 开风扇/关风扇. 像这种开关动作, 一般使用I/O卡控制. 假设I/O卡有很多种型号. 这里可以使用Simaple Factory模式 角色 IO卡创建工厂1个(CIODeviceFactory)(提供静态方法CreateIODevice(nIODeviceType)来创建具体类) 抽象IO卡类1个(CIODevi

cay22的专栏 1736

温度PID控制PLC程序

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

junxuezheng的博客 2051

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java设计模式-结构型设计模式-适配器模式

Java设计模式- 结构型设计模式-适配器模式

Fatter$hday的博客 1931

【设计模式笔记21】:结构型模式之适配器模式

摘要:适配器模式是一种结构型设计模式,用于解决接口不兼容问题。通过创建一个适配器类(如AngleAdapter),将现有类(Adaptee)的方法转换为目标接口(Target)所需的形式,使原本不兼容的类能够协同工作。该模式具有复用性好、透明性和符合开闭原则等优点,适用于系统升级改造、复用现有类库等场景。文中以绘图系统为例,展示了如何通过对象适配器模式将Angle类的DrawAngle()方法适配为Shape接口的Draw()方法,实现不同图形类的统一管理。

lyh2004_08的博客 1082

结构型模式之适配器模式(Java版)

设计模式概述及分类:https://blog.youkuaiyun.com/qq_34896730/article/details/105324092 面向对象设计原则:https://editor.youkuaiyun.com/md/?articleId=105352240 适配器模式1 结构型模式2 适配器模式概述3 适配器模式结构与实现3.1 适配器模式结构 1 结构型模式       在面向对象软件系统中,每个类/对象都承担了一定的职责,它们可以相互协作,实现一些

qq_34896730的博客 3615

【23种设计模式】结构型模式详细介绍

本文为 【23种设计模式】结构型模式 相关内容介绍,下边将对适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式,代理模式,具体包括它们的特点与实现等进行详尽介绍~

小新要变强的博客 1417

设计模式学习笔记三:结构型模式(Structural Pattern)

声明:学习内容均来自《设计模式的艺术》这本书。

itman1010的博客 1658

Java 设计模式——适配器模式

本文介绍了适配器模式相关的知识。

代码星辰的博客 3311

《设计模式详解》结构型模式 - 适配器模式

适配器模式5.2 适配器模式5.2.1 概述5.2.2 结构5.2.3 类适配器模式5.2.4 对象适配器模式5.2.5 接口适配器模式5.2.6 应用场景5.2.7 JDK 源码解析 完整的笔记目录:《设计模式详解》笔记目录,欢迎指点! 结构型模式描述如何将类或对象按某种布局组成更大的结构,有以下两种: 类结构型模式:采用继承机制来组织接口和类。 对象结构型模式:釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足 “合成复用原则”,所以对象结构型模式比类结构型模式具有更大的

萌宅鹿的技术小屋 1445

设计模式——结构型模式

文章目录1、适配器模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 52、组合模型介绍实现步骤 1步骤 23、装饰器模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 54、代理模式介绍实现步骤 1步骤 2步骤 35、享元模式介绍实现步骤 1步骤 2步骤 3步骤 46、外观模式介绍实现步骤 1步骤 2步骤 3步骤 47、桥接模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 5 1、适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合

前尘忆梦的博客 1408
上一篇: 设计模式笔记(6)---原型模式(创建型)
下一篇: 程序员怎样学习英语
oec2003
博客等级 码龄20年 373粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值