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

数学建模小白必看:层次分析法(AHP)从入门到实战(附Python代码) 本文详细介绍了层次分析法(AHP)在数学建模竞赛中的应用,从构建判断矩阵到一致性检验,再到权重计算和实战案例。通过Python代码实现,帮助小白快速掌握AHP的核心技巧,解决评价类难题,提升建模效率。 阅读详情
设计模式学习笔记(七)——Adapter适配器模式

       Adapter适配器模式是一种结构型模式,主要应对:由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是,新环境要求的接口是现存对象所不满足的。

       《设计模式》中说道:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

       在实际的生活中有很多例子,如:我们常使用的移动硬盘,无论是笔记本硬盘还是台式机硬盘,对于数据的传输都不使用Usb的数据线,外接的硬盘盒就是将原来的硬盘数据传输方式适合Usb数据线。(哎,我那个硬盘盒买的时候还190元,其实一点都不值,整个一个盒,就那个转接芯片比较值钱,我说50,人家不卖)。

       我再接着说适配器模式,先举个简单的代码例子,我现在要做一个队列的类,实现先进先出的功能。利用ArrayList对象。

       首先,我们先定义一些队列的接口,接口中定义队列的方法,代码如下:

       interface IQueue

    {

        void push(object item);     //进队列

        object putout();            //出队列

        object ShowLastItem();      //返回队列中最后一项

        object ShowFirstItem();     //返回队列中第一项

    }

    下面我们再来利用ArrayList对象实现一个队列:

    class Queue:IQueue

    {

        ArrayList adaptee;

       

        public Queue()

        {

            adaptee = new ArrayList();

        }

 

        public void push(object item)

        {

            adaptee.Add(item);

        }

 

        public object putout()

        {

            object item = adaptee[0];

            adaptee.RemoveAt(0);

            return item;

        }

 

        public object ShowLastItem()

        {

            return adaptee[adaptee.Count-1];

        }

 

        public object ShowFirstItem()

        {

            return adaptee[0];

        }

    }

    实现有了,现在用客户端程序调用来看一下结果:

    class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            Queue queue = new Queue();

            queue.push(1);

            queue.push(2);

            queue.push(3);

            queue.push(4);

            queue.push(5);

            Console.Write("FirstItem:" + queue.ShowFirstItem().ToString() + "/n");

            Console.Write("LastItem:" + queue.ShowLastItem().ToString() + "/n");

            Console.Write("output:" + queue.putout().ToString() + "/n");

            queue.push(6);

            Console.Write("FirstItem:" + queue.ShowFirstItem().ToString() + "/n");

            Console.Write("LastItem:" + queue.ShowLastItem().ToString() + "/n");

            Console.Read();

        }

    }

    输出结果:

    FirstItem:1

LastItem:5

output:1

FirstItem:2

LastItem:6

 

适配器模式实现有两种类型:对象适配器、类适配器。上面的代码是对象适配器方式。也就是适配器(Queue)中是使用被适配(ArrayList)的对象实现。它的结构如下:


   
Gof
《设计模式》中提到了两种Adapter适配器模式,一种叫对象适配器模式,另一种叫类适配器模式。对象适配器模式的结构如上图,也就是我刚才举的那个例子,那什么是类适配器模式呢?实际上类适配器模式就是让Adapter的实现继承Adaptee。换句话说:类适配器模式是以继承的方式来实现,而对象适配器模式是以组合的方式实现。以前我们说过:继承增加了模块间的耦合程度,而组合降低了耦合程度,所以有人建议多使用对象适配器模式,少用类适配器模式。不过既然提到,我也具体谈谈类适配器模式。它的结构如下图:

    我们依然用上面的那个队列的例子,首先我们要实现一个Adapter的类,这个类要继承适配对象Adaptee类,也就是例子中的ArrayList,还有队列接口,就是我们定义的IQueue,代码如下:

    class ClassAdapter:ArrayList,IQueue

    {

        public ClassAdapter()

        {

           

        }

 

        public void push(object item)

        {

            this.Add(item);

        }

 

        public object putout()

        {

            object item = this[0];

            this.RemoveAt(0);

            return item;

        }

 

        public object ShowLastItem()

        {

            return this[this.Count-1];

        }

 

        public object ShowFirstItem()

        {

            return this[0];

        }

    }

    然后我们再修改一下客户代码:

        static void Main(string[] args)

        {

            ClassAdapter queue = new ClassAdapter();

            queue.push(1);

            queue.push(2);

            queue.push(3);

            queue.push(4);

            queue.push(5);

            Console.Write("FirstItem:" + queue.ShowFirstItem().ToString() + "/n");

            Console.Write("LastItem:" + queue.ShowLastItem().ToString() + "/n");

            Console.Write("output:" + queue.putout().ToString() + "/n");

            queue.push(6);

            Console.Write("FirstItem:" + queue.ShowFirstItem().ToString() + "/n");

            Console.Write("LastItem:" + queue.ShowLastItem().ToString() + "/n");

            Console.Read();

        }

    输出结果为:

FirstItem:1

LastItem:5

output:1

FirstItem:2

LastItem:6

要说明一点:从实现的代码看:ClassAdapter类同时继承了ArrayList,IQueue,这样违反了设计原则中的单一职责原则(SRP)——一个类应该仅有一个引起他变化的原因。

接下来,我们在看看Adapter模式的几个要点:

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

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

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

Adapter模式的实现方法有很多,说到这我在举一个例子,我现在有这样一个场景。我有一辆BORA车子和BMW的Engine和Wheel,我现在想改装这辆BORA使其拥有BMW的Engine和Wheel,我如何做呢?

首先,我们要拥有一些BMW的零部件,代码如下:

class BMWPartClass

    {

        public void BMWEngine()

        {

            Console.Write("It is a BMWEngine/n");

        }

 

        public void BMWWheel()

        {

            Console.Write("It is a BMWWheel/n");

        }

}

然后,再来实现对这些零部件的适配,代码如下:

interface ITarget

    {

        void Request();

    }

 

    class Adapter:ITarget

    {

        BMWPartClass adaptee = new BMWPartClass();

 

        public void Request()

        {

            adaptee.BMWEngine();

            adaptee.BMWWheel();

        }

}

对于我的BORA的实现:

class MyBORAClass

    {

        public void Process(ITarget target)

        {

            target.Request();

        }

}

最后是客户端代码:

static void Main(string[] args)

        {

            MyBORAClass bora = new MyBORAClass();

            bora.Process(new Adapter());

            Console.Read();

    }

输出结果是:

It is a BMWEngine

It is a BMWWheel

 
linux v3h平台开发系列详解(GMSL摄像头篇):1.11 解串器MIPI 1.5G高速率特殊deskew配置 解串器max96712 deskew配置 阅读详情

相关推荐

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策

统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25

weixin_30846347的博客 265

解析大模型常用微调方法:P-Tuning、Prefix Tuning、Adapter、LoRA 看这篇就够了!赶紧收藏!

预训练大模型虽然具有强大的泛化能力和广泛的知识,但它们通常是针对大量通用数据集进行训练的,这使得它们在处理特定任务时可能无法达到最佳效果,比如ChatGPT、混元、文心一言在回答一些常识性问题时表现的非常出色,但在物理、化学或编程等专业性问题上往往变的傻了吧唧。怎样让大模型更好地适用于特定场景?此时我们就需要利用特定任务的数据集来进一步训练模型,通过模型精调让全能型大模型变的专而精。这种针对性的精调训练能够使模型更加专注于目标任务的特征,从而提高其在特定任务上的准确性和效率。

datian1234的博客 1325

Cadence17.4 Allegro PCB制板(gerber / 光绘)文件输出的顺序及注意点

Cadence Allegro PCB制板文件输出 (gerber 光绘文件输出)

weixin_45331044的博客 1万+

设计模式(五)适配器模式Adapter(结构型)

设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。 例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源...

weixin_30414245的博客 1251

Unity安卓打包实战:SDK与JDK配置全攻略

本文详细介绍了Unity安卓打包过程中SDK与JDK的配置方法,包括工具下载、安装步骤、环境变量设置及常见错误排查。通过实战指南帮助开发者快速完成Unity安卓打包环境搭建,提升开发效率。

weixin_30338481的博客 415

双内核架构 Xenomai 4 安装教程

双内核 Xenomai 4 安装指南

^_^ 4467

适配器模式

《设计模式》中说道:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。 Gof《设计模式》中提到了两种Adapter适配器模式,一种叫对象适配器模式,另一种叫类适配器模式。对象适配器模式的结构如上图,也就是我刚才举的那个例子,那什么是类适配器模式呢?实际上类适配器模式就是让Adapter的实现继承Adaptee。换句话说:类适配器

lijianli9的专栏 667

copilot基于 DeepSeek-R1 思路构建 VLA 自动驾驶强化学习系统

下面给出一个完整示例代码,结合 DeepSeek‑R1 的技术方法,实现一个端到端的 VLA(视觉+语言行动)自动驾驶深度强化学习系统。.2f。

ywfwyht的博客 774

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

好长时间没写学习笔记了,由于前段时间一直在准备校招,现在offer也签了,基本定了下来,可以继续了,今天抽点时间继续学习设计模式,今天学习的是适配器模式; 设计模式学习笔记(一)之单例模式(Singleton)设计模式学习笔记(二)之观察者模式(Observer) 设计模式学习笔记(三)装饰模式(Decorator) 设计模式学习笔记(四)之工厂模式(Factory) 设计模式学习

江清清的专栏 2608

手把手教你为智能手表DIY一个离线导航:LVGL + SD卡地图实战

本文详细介绍了如何为智能手表DIY一个离线导航系统,结合LVGL图形库和SD卡地图数据。从硬件选型、地图数据处理到LVGL地图引擎实现,提供了完整的实战指南,特别适合户外运动爱好者和嵌入式开发者。文章还分享了功耗优化、性能提升等实用技巧,帮助读者打造高效的离线导航解决方案。

weixin_42570484的博客 206

SolidWorks软件二次开发:使用C#进行SolidWorks二次开发

SolidWorks 提供的 API(应用程序编程接口)允许开发者使用多种编程语言(如 C#、VB.NET 等)来控制和扩展 SolidWorks 的功能。API 架构基于 COM(组件对象模型),这意味着开发者可以通过引用 SolidWorks 的类型库来访问其对象模型。SolidWorks 的对象模型包括了从文档、零件、装配体到特征、草图等所有 SolidWorks 中可操作的对象。

kkchenjj的博客 3214

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

适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。动机:在软件系统中,由于应用环境的变化,常常需要将“一些现存对象”放在新的环境中使用,但是新环境中要求的接口是这些现存对象不能满足的。如何应对这种“迁移的变化”,如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口。意图:将一个类的接口转换成客户需要的另一个接口。Adapter模式使得原本由于接口不兼容而

Erictianya的专栏 533

如何解决Dify重新部署(升级到最新版)后出现的Setup failed: PermissionDenied等问题

重新部署(升级)Dify后遇到Permission denied错误?🚫 本文详细分析了这个问题的原因🔐,并提供了完整的解决步骤来修复这个问题✨

XiaoqiangClub的博客 1653

【设计模式学习笔记七】【结构型模式】【适配器模式(Adapter)】

适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。别名:包装器(Wrapper)。 1)能够画出这个设计模式的架构框图; 2)能够根据架构框图写出对应的伪代码; 3)这个模式的应用场景,主要优缺点。

seaicelin的博客 732

VB摄像头监控

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

ProgramNovice的博客 2158

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

小威的博客 2万+

IEM模型,地表粗糙度模拟

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

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

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

miaoyl的博客 5712

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

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

junxuezheng的博客 2051

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

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

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

遇见伯灵说的博客 1816

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

基本概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。          在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。适配器模式还有一个特例,就是缺省适配模式(Default Adapter),又称接口适配模式。 1、 类适配器模式         把适配类的API转换成目标类

在路上 3125

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

适配器模式是一种结构型设计模式,其核心目的是:将一个类的接口转换成客户端期望的接口,使原本由于接口不兼容而不能一起工作的类可以协同工作。换句话说,它就像现实生活中的插头适配器:你想插电器,但插头类型不匹配,适配器帮你转换接口。

TechNomad的博客 1510

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

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

Carson带你学Android 3万+

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

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

wesigj的博客 1862

[设计模式]Adapter适配器模式

Adapter适配器模式 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 通俗的说就是,A类想调用B类的方法,只能通过创建适配器的方法来调用;结合代码来说就是,目标类想调用被适配者类的方法,是通过适配者类来调用的。 双方都不适合修改的时候,可以考虑使用适配器模式。 Adapter模式其实就是把完成同样的一个功能但...

超越 1420
上一篇: 设计模式学习笔记(六)——Prototype原型模式
下一篇: 设计模式学习笔记(八)——Bridge桥接模式
zhy05
博客等级 码龄21年 21粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值