大话设计模式之适配器模式

news2024/11/19 21:25:19

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

适配器模式涉及以下几个关键角色:

1. 目标接口(Target):客户端期望使用的接口。适配器通过实现这个接口来使得被适配的类能够与客户端协同工作。

2. 适配器(Adapter):它是适配器模式的核心组件,它实现了目标接口,并持有一个被适配的对象的引用。适配器通过调用被适配对象的方法来实现目标接口的方法。

3. 被适配者(Adaptee):它是客户端不直接使用但需要被适配器适配的类。

适配器模式可以分为两种实现方式:

- 类适配器模式:通过多重继承(在一些编程语言中支持多重继承的情况下)或者通过代理的方式实现适配器。在这种情况下,适配器类同时继承目标接口和被适配者类,并实现目标接口的方法,内部调用被适配者类的方法。

- 对象适配器模式:通过组合的方式实现适配器。在这种情况下,适配器持有一个被适配者类的引用,并实现目标接口的方法,内部调用被适配者类的方法。

适配器模式的优点包括:

- 提高了代码的复用性,可以将现有的类和接口组合在一起使用。
- 使得客户端无需修改现有代码,就可以使用新的接口。
- 可以解决不兼容接口之间的问题,使得原本不兼容的类可以协同工作。

但是,适配器模式也有一些缺点,例如:

- 如果适配器类过多,可能会导致系统中存在大量的适配器类,增加了系统的复杂性。
- 如果被适配者类的接口发生变化,可能需要修改适配器类的代码。

总的来说,适配器模式适用于需要在不改变现有代码的情况下与不兼容的接口进行交互的场景,它是一种非常有用的设计模式。

#include <iostream>

// 被适配的类
class LegacyRectangle {
public:
    LegacyRectangle(int width, int height) : width_(width), height_(height) {}

    int calculateArea() const {
        return width_ * height_;
    }

private:
    int width_;
    int height_;
};

// 目标接口
class Rectangle {
public:
    virtual ~Rectangle() {}
    virtual int getArea() const = 0;
};

// 适配器类,继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象
class RectangleAdapter : public Rectangle {
public:
    RectangleAdapter(const LegacyRectangle& legacyRectangle) : legacyRectangle_(legacyRectangle) {}

    int getArea() const override {
        // 在适配器中调用被适配者的方法
        return legacyRectangle_.calculateArea();
    }

private:
    LegacyRectangle legacyRectangle_;
};

int main() {
    // 使用适配器来调用 LegacyRectangle 的方法,但是通过 Rectangle 接口
    LegacyRectangle legacyRect(5, 10);
    RectangleAdapter adapter(legacyRect);

    // 通过 Rectangle 接口调用
    std::cout << "Area: " << adapter.getArea() << std::endl;

    return 0;
}

/*
在这个示例中,LegacyRectangle 类是一个已经存在的类,它有一个 calculateArea() 方法用于计算矩形的面积。然后我们定义了一个新的接口 Rectangle,其中有一个 getArea() 方法用于获取矩形的面积。RectangleAdapter 类是适配器,它继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象,并在 getArea() 方法中调用 LegacyRectangle 的 calculateArea() 方法来实现 Rectangle 接口的方法。最后在 main() 函数中,我们通过适配器来使用 LegacyRectangle 的方法,但是通过 Rectangle 接口调用。
*/

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

鸿蒙OS开发实例:【组件化模式】

组件化一直是移动端比较流行的开发方式&#xff0c;有着编译运行快&#xff0c;业务逻辑分明&#xff0c;任务划分清晰等优点&#xff0c;针对Android端的组件化&#xff1b;与Android端的组件化相比&#xff0c;HarmonyOS的组件化可以说实现起来就颇费一番周折&#xff0c;因为…

[Arduino学习] ESP8266读取DHT11数字温湿度传感器数据

目录 1、传感器介绍 2、接线 3、DHT.h库 1、传感器介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;是简单环境监测项目的理想选择。 温度分辨率为1C&#xff0c;相对湿度为1&#xff05;。温度范围在0C到50C之间&#xff0c;湿度的测…

antd/x6-graph——实现流程图绘制功能——技能提升

效果图&#xff1a; 解决步骤1&#xff1a;安装"antv/x6": "^1.35.0" npm install antv/x61.35.0安装指定版本的antv/x6插件 解决步骤2&#xff1a;配置tools文件 在assets/js中新增一个graphTools.js文件 内容如下&#xff1a; /* antv x6图谱相关…

启动mysql

删除C:\Program Files (x86)\MySQL\MySQL Server 5.7这个路径下的data文件夹&#xff0c;这个很难删除&#xff0c;因为一开机&#xff0c;mysql的某些服务就启动了&#xff0c;每次重新启动mysql之前&#xff0c;都要删除这个文件夹 因为这个文件夹在后端执行一些我们看不到的…

从零开始:Flutter应用上架iOS的完整流程解析

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Java基于微信小程序的电子竞技信息交流系统,附源码(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

前视声呐目标识别定位(八)-代码解析之各模块通信

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

51单片机入门_江协科技_20.1_Proteus串口仿真

1.为了解决51单片机学习过程中在Proteus中的串口仿真的问题&#xff0c;需要在Proteus中建立串口仿真的环境&#xff08;目前Proteus安装在Win7x64虚拟机环境中&#xff1b; 2. 在CSDN中找到VSPD下载地址&#xff0c;在虚拟机中进行VSPD的安装&#xff0c;具体链接地址如下&am…

MySQL 学习心得和知识总结(五)|MySQL的一般查询日志(general log)

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

计算机视觉——图像金字塔理解与代码示例

图像金字塔 有时为了在图像中检测一个物体&#xff08;例如人脸、汽车或其他类似的物体&#xff09;&#xff0c;需要调整图像的大小或对图像进行子采样&#xff0c;并进行进一步的分析。在这种情况下&#xff0c;会保持一组具有不同分辨率的同一图像。称这种集合为图像金字塔…

耐腐蚀耐高温实验室塑料烧杯进口高纯PFA材质反应器特氟龙烧杯

PFA烧杯在实验过程中可作为储酸容器或涉及强酸强碱类实验的反应容器&#xff0c;用于盛放样品、试剂&#xff0c;可搭配电热板加热、蒸煮、赶酸用。 外壁均有凸起刻度&#xff0c;直筒设计&#xff0c;带翻边&#xff0c;便于夹持和移动&#xff0c;边沿有嘴&#xff0c;便于倾…

【前端面试3+1】10 npm run dev 发生了什么、vue的自定义指令如何实现、js的数据类型有哪些及其不同、【最长公共前缀】

一、npm run dev发生了什么 运行npm run dev时&#xff0c;通常是在一个基于Node.js的项目中&#xff0c;用来启动开发服务器或者执行一些开发环境相关的任务。下面是一般情况下npm run dev会执行的步骤&#xff1a; 1. 查找package.json中的scripts字段&#xff1a; npm会在项…

Unity自定义icon

Unity自定义icon 1. 新建文件夹 OfficeFabricIconSet2. 新建Iconset3. 新建子文件夹Textures并添加icon图片4. 向iconset添加Quad Icons5. 最终效果 教程来源处&#xff1a; https://365xr.blog/build-your-own-button-icon-set-for-microsoft-hololens-2-apps-with-mrtk-using…

园区管理(源码+文档)

园区管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端登录页我的退出登录发布详细注意事项公告列表入园记录主页我的资料电梯报修意见反馈客服入园申请注册招商列表 后台管理签到管理公告管理招商管理入园管理反馈报…

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml&#xff0c;脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…

从汇编看函数调用

文章目录 函数调用流程栈相关寄存器及的作用简介寄存器功能指令功能 函数的括号{}正括号反括号 栈函数调用函数内部处理 参数传递传值&#xff0c;变量不可改传指针&#xff0c;变量可改C 传引用 函数调用流程 目标&#xff1a;函数调用前后栈保持不变 保存main函数的寄存器…

爬虫实战三、PyCharm搭建Scrapy开发调试环境

#一、环境准备 Python开发环境以及Scrapy框架安装&#xff0c;参考&#xff1a;爬虫实战一、Scrapy开发环境&#xff08;Win10Anaconda&#xff09;搭建 PyCharm安装和破解&#xff0c;参考&#xff1a;爬虫实战二、2019年PyCharm安装&#xff08;激活到2100年&#xff09; …

【机器学习】“强化机器学习模型:Bagging与Boosting详解“

1. 引言 在当今数据驱动的世界里&#xff0c;机器学习技术已成为解决复杂问题和提升决策制定效率的关键工具。随着数据的增长和计算能力的提升&#xff0c;传统的单一模型方法已逐渐无法满足高精度和泛化能力的双重要求。集成学习&#xff0c;作为一种结合多个学习算法以获得比…

WPS二次开发专题:如何获取应用签名SHA256值

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…