2023-6-15-第六式适配器模式

news2024/12/26 21:16:11


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述
设计方法二十三式之适配器模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、类适配器实现
  • 🎉三、对象适配器实现
  • 🐱‍🚀四、模块之间的关系
  • 🎂五、注意事项
  • 🥩六、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另外一个接口。适配器模式通常用于两个已有系统之间接口不兼容的情况下,或者在需要复用一个已有类而其接口不符合当前需求的情况下。

适配器模式包含以下几个角色:

  1. 目标(Target):定义客户端所期望的接口,这是客户端代码所使用的接口。

  2. 适配器(Adapter):实现目标接口,并且持有一个被适配对象的引用。适配器将客户端请求转换成被适配对象可以处理的格式。

  3. 被适配对象(Adaptee):定义了原始接口,但与目标接口不兼容。

  4. 客户端(Client):调用目标接口来完成相应的业务逻辑。

在适配器模式中,适配器通过将客户端的请求转换成被适配对象可以处理的格式,从而使得客户端能够和被适配对象进行交互。适配器模式分为类适配器对象适配器两种实现方式。

类适配器使用多继承的方式,同时继承目标和被适配类,通过重写目标接口的方法来调用被适配类的方法。对象适配器使用组合的方式,将被适配类的实例作为一个成员变量,并实现目标接口,通过委托被适配类的方法来处理客户端请求。

适配器模式的优点在于能够提高系统的灵活性和可复用性,同时能够降低系统的耦合度。其缺点在于增加了系统的复杂度,并且可能会影响到代码的可读性和性能。


🐱‍🐉二、类适配器实现

C++类适配器是一种适配器模式的实现方式,用于将一个类的接口转换成另外一个客户端所期望的接口。下面是一个简单的C++类适配器的实现示例:

// 目标接口
class ITarget {
public:
    virtual void request() = 0;
};

// 被适配类
class Adaptee {
public:
    void specificRequest() {
        cout << "Adaptee::specificRequest" << endl;
    }
};

// 类适配器
class Adapter : public ITarget, private Adaptee {
public:
    void request() {
        specificRequest();
    }
};

// 客户端代码
int main() {
    ITarget* target = new Adapter();
    target->request();

    delete target;
    return 0;
}

在上述示例中,目标接口ITarget定义了客户端所期望的接口,被适配类Adaptee定义了原始接口,但与目标接口不兼容。适配器Adapter通过继承目标接口ITarget和被适配类Adaptee,并实现目标接口的方法request,从而能够将客户端请求转换成被适配对象可以处理的格式。客户端代码通过调用适配器的request方法来完成相应的业务逻辑。

需要注意的是,在这个示例中,适配器Adapter使用了多重继承的方式同时继承了目标接口ITarget和被适配类Adaptee,从而实现了接口的转换。此外,适配器Adapter在实现目标接口ITarget的request方法时,调用了被适配类Adaptee的specificRequest方法来处理客户端请求。


🎉三、对象适配器实现

C++对象适配器是一种适配器模式的实现方式,用于将一个类的接口转换成另外一个客户端所期望的接口。下面是一个简单的C++对象适配器的实现示例:

// 目标接口
class ITarget {
public:
    virtual void request() = 0;
};

// 被适配类
class Adaptee {
public:
    void specificRequest() {
        cout << "Adaptee::specificRequest" << endl;
    }
};

// 对象适配器
class Adapter : public ITarget {
public:
    Adapter(Adaptee* adaptee) : m_adaptee(adaptee) {}
    void request() {
        m_adaptee->specificRequest();
    }
private:
    Adaptee* m_adaptee;
};

// 客户端代码
int main() {
    Adaptee* adaptee = new Adaptee();
    ITarget* target = new Adapter(adaptee);
    target->request();

    delete target;
    delete adaptee;
    return 0;
}

在上述示例中,目标接口ITarget定义了客户端所期望的接口,被适配类Adaptee定义了原始接口,但与目标接口不兼容。适配器Adapter通过组合被适配类Adaptee,并实现目标接口ITarget的方法request,从而能够将客户端请求转换成被适配对象可以处理的格式。客户端代码创建了被适配类Adaptee的实例,并通过创建适配器Adapter的实例,并将被适配类Adaptee的实例传递给适配器,从而完成了相应的业务逻辑。

需要注意的是,在这个示例中,适配器Adapter使用了组合的方式来持有被适配类Adaptee的实例,并在实现目标接口ITarget的request方法时,通过委托被适配类Adaptee的specificRequest方法来处理客户端请求。


🐱‍🚀四、模块之间的关系

适配器模式主要涉及三个核心组件之间的关系:目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)。

  1. 目标接口(Target):目标接口定义了客户端代码所期望的接口。它是客户端与适配器进行交互的方式,客户端通过调用目标接口定义的方法来完成相应的业务逻辑。

  2. 适配器(Adapter):适配器实现了目标接口,并且持有一个被适配者的引用。适配器的主要作用是将客户端对目标接口的调用转换成被适配者可以处理的格式或形式,从而使得客户端能够与被适配者进行交互。

  3. 被适配者(Adaptee):被适配者定义了原始接口,但与目标接口不兼容。被适配者是已经存在的类或模块,其功能和实现可能与目标接口不一致,需要通过适配器来进行转换以满足客户端的需求。

在适配器模式中,客户端通过调用目标接口来发起请求,适配器接收到这些请求后会将其转发给被适配者进行处理。适配器负责将客户端的请求转换为被适配者可以理解和处理的形式,同时还可以进行一些适配过程中的转换或调整操作。被适配者根据适配器传递过来的请求进行实际的处理,并将结果返回给适配器,然后适配器再将结果返回给客户端。

总结起来,适配器模式通过适配器将客户端与被适配者连接起来,使得不兼容的接口能够协同工作。适配器模式可以在现有系统中引入新功能、提高系统的灵活性和可复用性,并且能够降低系统之间的耦合度。


🎂五、注意事项

在使用适配器模式时,有一些注意事项需要考虑:

  1. 接口设计:在定义目标接口和被适配者接口时,需要充分考虑业务需求和系统设计,确保接口的一致性和灵活性。好的接口设计将减少适配器的复杂性和代码修改量。

  2. 适配器的选择:根据具体情况选择类适配器还是对象适配器。类适配器采用多重继承,可能对继承层次产生影响,并且无法适配被适配者的子类。对象适配器使用组合关系,能够适配被适配者的任意子类,并且更加灵活。

  3. 适配器的实现方式:适配器可以使用继承或组合来与被适配者进行连接。继承方式适用于已经存在的类或模块,而组合方式则更加灵活,可以适配不同类型的对象。

  4. 兼容性和稳定性:在适配过程中,需要确保适配器能够正确地转换客户端的请求并与被适配者进行交互,使得整个系统的行为一致且稳定。特别是在涉及到多个适配器和被适配者之间的协同工作时,要保证数据和状态的正确传递。

  5. 性能考虑:适配器模式可能会引入额外的中间层,对系统的性能产生一定的影响。在设计和使用适配器时,需要权衡性能与代码的可读性、可维护性,并进行必要的优化。

  6. 单一职责原则:一个适配器应该只负责适配相关的功能,遵循单一职责原则。如果一个适配器承担过多的功能,可能会导致代码复杂度增加,理解和维护困难。

总体而言,适配器模式是一种有用的设计模式,但在应用时应当谨慎选择和设计,确保它符合系统需求,并且不引入不必要的复杂性。


🥩六、使用场景

适配器模式通常适用以下场景:

  1. 老系统升级:在进行系统升级或重构时,可能需要引入新的组件或标准,而这些新的组件或标准与现有系统不兼容。使用适配器模式可以将新组件或标准适配到现有系统中,从而实现系统的平稳升级。

  2. 模块复用:在多个系统或模块之间存在共同点,但接口不一致的情况下,可以使用适配器模式将这些模块进行复用,提高代码的可维护性和复用性。

  3. 接口转换:在使用第三方库或接口时,可能需要对其进行适配以满足自身业务需求。适配器模式可以将第三方接口适配成符合自身需求的接口形式。

  4. 多态处理:在处理多态对象时,可以使用适配器模式将不同类型的对象适配到同一个接口上,以便进行统一的处理。

  5. 数据库访问:在使用不同类型的数据库时,可以使用适配器模式将不同的数据库适配到同一种数据访问接口上,从而使得代码更加灵活和可扩展。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于适配器模式的一些内容






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过java程序获取表的自增主键值?

获取自增主键&#xff1a; 在 Java 程序中&#xff0c;使用 JDBC 插入记录到 MySQL 数据库时&#xff0c;可以通过以下步骤获取自增主键的值&#xff1a; 第一步&#xff1a;在 PreparedStatement 对象中添加 Statement.RETURN_GENERATED_KEYS 常量作为参数&#xff0c;表示希…

Zabbix与信创、云原生、高可用等热点解析|Zabbix大会·上海站

根据信通院调研显示&#xff0c;超过90%的中国金融机构已经引入开源软件。工信部突出强调开源在驱动软件产业发展的重要作用。作为一个完全开源免费的企业级监控解决方案&#xff0c;Zabbix在IT基础监控、网络监控、Server监控和云监控等领域都获得了同行和用户极高的评价。 Za…

html好看的登录页面1(十三种风格登录页面源码)

文章目录 1.登录风格效果说明1.1 背景凹起风登录界面1.2 弹出风登录界面1.3 科技时尚风登录界面1.4 蓝色一夏风登录界面1.5 模糊背景左右风登录界面1.6 上中下介绍风登录界面1.7 深沉科技风登陆界面1.8 舒适简洁风登录界面1.9 网站风登录界面1.10 小框清爽风登录界面1.11 夜色风…

【IoU全总结】GIoU, DIoU, CIoU, EIoUFocal, αIoU, SIoU,WIoU【基础收藏】

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 并不存在效果一定优秀的IoU&#xff0c;需要结合自己的网络、数据集试验。 不想深究原理可直接跳转总结。文内公式均为手打&#xff0c;非图片&#xff0c;方便查看 文章目录 L1 Loss&#xff0c;L2Loss&#xff0…

深入浅出剖析EL表达式和JSTL

el表达式 产生背景 从JSP2.0开始&#xff0c;就不推荐使用java脚本&#xff0c;而是使用el表达式或者动态标签代替 java脚本&#xff1b; 页面标签&#xff1b; 概念和原理 概念:Expression Language &#xff1a;jsp内置的一种表达式语言;原理:el表达式的出现目的是替换js…

这些excel英语翻译方法你会吗?

大家平常的时候应该都会去做Excel表格吧&#xff1f;无论是在读书、上班或者日常&#xff0c;必然都会使用到吧&#xff1f;但是在处理国际业务时&#xff0c;我们要来处理表格就会比较费时一点&#xff0c;因为语言的不同会有一点影响&#xff0c;所以我们可能需要将Excel表格…

第九章节 用Python实现常微分方程初值问题的数值解法

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第9章 常微分方程初值问题的数值解法 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 欧拉法后退的欧拉方法梯形方法改进欧拉公式补充龙格—库塔方法线性多步法阿当姆斯显示与隐式公式 9.1引…

cesium学习(entities实体)

什么是entities CesiumJS具有丰富的空间数据API&#xff0c;可分为两类&#xff1a;面向图形开发人员的低级Primitive API&#xff0c;以及用于数据驱动可视化的高级Entity API。 entitiesAPI公开了一组一致设计的高级对象&#xff0c;这些对象将相关的可视化和信息聚合到一个…

(转载)有导师学习神经网络的分类(matlab实现)

有导师学习神经网络以其良好的学习能力广泛应用于各个领域中&#xff0c;其不仅可以解决拟合回归问题&#xff0c;亦可以用于模式识别、分类识别。将继续介绍两种典型的有导师学习神经网络(GRNN和PNN),并以实例说明其在分类识别中的应用。 1 理论基础 1.1 广义回归神经网络(…

小雉系统U盘安装包制作

​ 本文原地址: http://www.feitianzhi.com/boke/index.php/archives/57/ 概述 小雉系统可从线上系统制作安装包到U盘&#xff0c;制作的安装包可用于新系统的安装&#xff1b; 小雉系统只提供升级包&#xff0c;对应的安装包均是客户在应用升级包后按本文或http://www.f…

为什么AirtestIDE的selenium Window突然无法检索控件了?

1. 前言 最近有很多朋友跟我们反馈&#xff0c;为什么1.2.15版本的IDE没办法做网页元素检索了&#xff0c;是不是我们不支持selenium了之类的。 测试后发现&#xff0c;目前版本确实存在这个问题&#xff0c;原因是Chrome113.0.5672.127(最新)版本过高&#xff0c;AirtestIDE…

ansible 的学习

目录 ansible学习思路&#xff1a; ansible是什么&#xff1f; 官网&#xff1a;Ansible is Simple IT Automation ansible的组成&#xff1a; 参考文档&#xff1a;Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客 ansible操作体验&#xff1a; 1、先…

机器学习算法(一)KNN近邻算法

一、KNN算法概述 KNN&#xff1a;K-Nearest-Neighbor算法&#xff0c;即K值为邻近。KNN是最简单的分类算法之一&#xff0c;同时&#xff0c;也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法。 二、原理 基于基于iris数据集&#xff0c;具体经历下面四步流程&am…

指南 | OpenAI API对PDF进行总结提炼

前言 本文将针对信息过载阅读搜索难的问题&#xff0c;展示如何利用OpenAI API高效地自动总结PDF&#xff0c;从而提高阅读效率和节省时间。包含详尽的操作教程、实际案例及最佳实践&#xff0c;旨在确保准确且高效地进行文档摘要。另外&#xff0c;本文还将深入探讨运用AI技术…

Cocos Creator3D:发布到 Web 平台

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 发布到 Web 平台 打开主菜单的 项目 -> 构建发布&#xff0c;打开构建发布面板。 Cocos Creator 3D 提供了两种 Web 平台的页面模板&#xff0c;可以通过 发布平台 的下拉菜单…

非靶代谢组学+肠道菌群测序:改善乳腺癌相关性疲劳——针灸!

文章标题&#xff1a; Acupuncture ameliorates breast cancer-related fatigue by regulating the gut microbiota-gut-brain axis 发表期刊&#xff1a;Frontiers in Endocrinology 影响因子&#xff1a;6.055 作者单位&#xff1a;河南中医药大学第一附属医院 百趣生物提…

新建项目框架详细过程(idea2021.3版本) IoC实例 DI

目录 使用Java Enterprise 一步到位 IOC、IOC容器、Bean、DI 1.IOC&#xff08;Inversion of Control&#xff09;控制反转 (1)什么是控制反转呢&#xff1f; (2)Spring和IOC之间的关系是什么呢? (3)IOC容器的作用以及内部存放的是什么? (4)当IOC容器中创建好service和…

【半监督图像分割 2023 CVPR】UniMatch

【半监督图像分割 2023 CVPR】UniMatch 论文题目&#xff1a;Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation 中文题目&#xff1a;重新审视半监督语义分割中的强弱一致性 论文链接&#xff1a;https://arxiv.org/abs/2208.09910 论文代码&a…

ES6 JavaSript

爬虫组件分析 目录概述需求&#xff1a; 设计思路实现思路分析1.最常用的ES6特性2.let, const3.class, extends, super4.arrow function5.template string 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&a…

MTK平台的SWT异常的简单总结(3)——常见SWT/ANR类型

&#xff08;1&#xff09;如何查看db文件Log &#xff08;2&#xff09;如何确认线程关系 &#xff08;3&#xff09;常见类型 &#xff08;A&#xff09;等锁 线程状态为"Blocked"&#xff0c;通过关键字"held by"进一步确认哪个线程拿住了锁&#xff…