不得不说的结构型模式-适配器模式

news2024/11/17 8:48:48

适配器模式(Adapter Pattern)是结构型模式之一,它将一个类的接口转换成客户希望的另一个接口,从而使原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式包括对象适配器和类适配器两种实现方式。

 

在对象适配器中,适配器通过包装一个需要适配的对象来实现接口转换,它将需要适配的对象作为成员变量,同时实现目标接口。在客户端调用目标接口时,适配器会将调用委托给被适配的对象,并根据需要进行接口转换和适配。在类适配器中,适配器通过多重继承来实现接口转换,它继承需要适配的类和目标接口,同时重写目标接口中的方法来实现接口转换。

以下是一个使用对象适配器实现的适配器模式的示例代码:

// 需要适配的接口
class ITarget {
public:
    virtual void Request() = 0;
};

// 需要适配的类
class Adaptee {
public:
    void SpecificRequest() {
        std::cout << "Adaptee::SpecificRequest()" << std::endl;
    }
};

// 对象适配器
class Adapter : public ITarget {
public:
    Adapter(Adaptee* adaptee) : m_adaptee(adaptee) {}

    virtual void Request() override {
        std::cout << "Adapter::Request()" << std::endl;
        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;
}

在这个示例代码中,我们需要将Adaptee类的SpecificRequest()方法适配成ITarget接口的Request()方法,我们定义了ITarget接口和Adaptee类,并在Adapter类中通过包装Adaptee对象来实现接口转换。在客户端中,我们通过创建Adaptee对象和Adapter对象,然后将Adapter对象传递给客户端,客户端就可以调用目标接口Request()方法来访问Adaptee对象的SpecificRequest()方法了。

适配器模式的实际应用非常广泛,例如在新旧系统的数据交换中,可能需要将一种数据格式转换成另一种数据格式,可以使用适配器模式来实现;在使用第三方库时,可能需要将第三方库的接口转换成自己的接口,可以使用适配器模式来实现;在复用旧代码时,可能需要将旧代码的接口转换成新的接口,可以使用适配器模式来实现。通过使用适配器模式,我们可以

复用现有代码和接口,避免修改原有代码和接口,从而减少风险。

适配器模式的好处包括:

  1. 适配器模式可以让两个原本不兼容的接口能够协同工作,提高代码的复用性和可维护性;
  2. 适配器模式可以避免修改原有的代码和接口,从而减少风险和工作量;
  3. 适配器模式可以将适配的代码和接口与客户端代码解耦,提高代码的灵活性和可扩展性。

适配器模式的缺点包括:

  1. 适配器模式可能会增加代码的复杂度,特别是在涉及多个适配器的情况下;
  2. 适配器模式可能会影响代码的性能,因为需要进行接口转换和适配;
  3. 适配器模式可能会隐藏原有代码和接口的缺陷和问题,需要谨慎使用。

适配器模式是一种非常有用的结构型设计模式,可以将两个不兼容的接口协同工作,提高代码的复用性和可维护性,同时也需要注意其可能带来的复杂度和性能问题。

下面我们用 C++ 代码来实现一个简单的适配器模式示例。

首先,我们定义一个目标接口 Target,包含一个输出字符串的纯虚函数 output()

class Target {
public:
    virtual ~Target() = default;
    virtual void output() const = 0;
};

接下来,我们定义一个已有的类 Adaptee,其中包含一个输出整数的函数 outputInteger()

class Adaptee {
public:
    void outputInteger() const {
        std::cout << "Output integer: " << 42 << std::endl;
    }
};

为了让 Adaptee 类能够与 Target 接口兼容,我们需要定义一个适配器类 Adapter,并继承自 Target 接口,同时包含一个指向 Adaptee 对象的指针:

class Adapter : public Target {
public:
    Adapter(const Adaptee* adaptee)
        : m_adaptee(adaptee) {
    }
    
    virtual void output() const override {
        m_adaptee->outputInteger();
    }

private:
    const Adaptee* m_adaptee;
};

在适配器的 output() 函数中,我们将调用 Adaptee 类的 outputInteger() 函数来实现输出整数的功能。

最后,我们可以通过如下代码来测试适配器模式的效果:

int main() {
    Adaptee adaptee;
    Target* target = new Adapter(&adaptee);

    target->output();

    delete target;
    return 0;
}

在这段测试代码中,我们首先创建了一个 Adaptee 类对象 adaptee,然后将其作为参数传递给了一个 Adapter 类对象 adapter,接着将 adapter 对象指针强制转换为 Target 接口指针,并通过该指针调用了 output() 函数。在运行时,output() 函数会调用 Adaptee 类的 outputInteger() 函数,最终输出整数 42。

总之,适配器模式可以帮助我们解决两个不兼容的接口之间的问题,提高代码的复用性和可维护性。在实际应用中,适配器模式经常被用于系统集成和接口转换等场景。

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

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

相关文章

Ae 入门系列之十:效果和动画预设

Ae 中提供了丰富的效果 Effects和动画预设 Animation Presets&#xff0c;可以轻松、快速地创建出各种酷炫的动画。 ◆ ◆ ◆ 效果 添加效果 方法一&#xff1a;先选中一个或多个图层&#xff0c;然后在Ae菜单&#xff1a;效果 Effect中找到并添加需要的效果。 方法二&#x…

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…

Allegro PCB后处理

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。这是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xff0…

nodejs+python+php+springboot+vue 校园快递代取配送系统

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;对注册的用户信息进行删除&#xff0c;查询&#xff0c;添加&#xff0c;修改 4.配送员管理&#xff1a;对配送员信息进行添加&#xff0c;修…

力扣刷题——移除元素

1、移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

【模拟IC】版图的基础操作和基础知识总结(1)

今天总结一下在画版图使用的基本操作和遇到的问题及解决方法。# 一、基本操作 &#xff08;1&#xff09;首先是使用layout XL的优势是可以对应原理图的器件&#xff0c;这样方便我们画版图。 &#xff08;2&#xff09;快捷键的操作&#xff1a; F 进行整体版图的居中 K 就是…

忙碌中也要记得休息,这两款好玩的游戏推荐给你

第一款&#xff1a;古墓丽影9年度版 《古墓丽影9》&#xff08;原名Tomb Raider&#xff09;是由水晶动力开发&#xff0c;史克威尔艾尼克斯发行的动作冒险游戏。 它于 2013 年发布。续集是古墓丽影崛起和古墓丽影暗影。 本作的重点是新版劳拉&#xff08;Lara Croft&#xf…

关于xilinx使用PCIE实现FPGA的部分重配置实现(MCAP)

平台&#xff1a;vivado21018.3 芯片&#xff1a;xcku115-flva1517-2-i (active) 本文官方文档&#xff1a;Xilinx_Answer_64761_Ultrascale_Devices 本文驱动下载地址&#xff1a;64761 - Bitstream Loading across the PCI Express Link in UltraScale and UltraScale Dev…

会话分享支持指定读写权限,网络设备支持账号切换、账号改密等自动化操作,JumpServer堡垒机v3.2.0发布

2023年4月24日&#xff0c;JumpServer开源堡垒机正式发布v3.2.0版本。在这一版本中&#xff0c;会话分享支持指定读写权限&#xff0c;让会话分享更加安全可靠。账号收集支持自动同步功能&#xff0c;并支持通过账号模版功能批量添加资产账号&#xff0c;同时账号切换功能新增支…

IT人员选择光缆的五大原因

基于铜和光纤的信号都会受到衰减&#xff0c;或者波形信号随着距离的推移而减弱。然而&#xff0c;光纤电缆可以在更长的距离上传输数据。事实上&#xff0c;差异是巨大的。 当构建需要长距离、高速和/或高带宽连接的网络时&#xff0c;毫无疑问&#xff1a;光纤电缆会赢得胜利…

使用ChatGPT完成程序开发——目标:不写一行代码完成图像识别并点击

本文作为一个使用AI开发的思路&#xff0c;让更多的人可以利用AI完成一些简单的程序&#xff0c;文中使用的是国内镜像GTP3.5 源码: GitHub - kasimshi/testCV: AI编写的OpenCV图像识别例子 GTP镜像: 知汇 对AI描述我们要做的功能&#xff0c;让它给给初步的思路和方向 作为新…

opencv-python视频分析与目标跟踪

目录 光流 目标跟踪 一、光流 使用OpenCV光流分析&#xff0c;跟踪蚂蚁的轨迹&#xff1a; 代码实现&#xff1a; import numpy as np import cv2if __name__ __main__:cap cv2.VideoCapture(ant.mp4)# ShiTomasi 角点检测参数feature_params dict(maxCorners100,quali…

ConcurrentHashMap底层实现原理

ConcurrentHashMap底层实现原理 ConcurrentHashMap的整体架构ConcurrentHashMap的基本功能ConcurrentHashMap在性能方面的优化 ConcurrentHashMap的整体架构 1.8中的存储结构&#xff1a; 它是由数组、单向链表、红黑树组成的。 当们去初始化一个ConcurrentHashMap实例的时候…

【工具】FFmpeg|超大视频本地有损压缩,500MB变5MB(支持 Windows、Linux、macOS)

参考&#xff1a; 如何将一分钟长的1080p视频压缩至5MB以内&#xff1f;-知乎-滔滔清风近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤&#xff0c;安装FFmpeg、运行指令、打开视频。 亲测 500MB 变 5MB。 1 安装FFmpeg 对于不需要看教程可以自行完成安装的同学们&…

哪款手持洗地机更好用?好用的手持洗地机分享

家居卫生清洁对于每个家庭来说都是必不可少的事情&#xff0c;尤其是地面清洁更是需要重视。传统的清洁方法需要频繁更换工具才能完成吸、拖、吸的清洁步骤&#xff0c;而这个过程费时费力且效果并不尽如人意。然而&#xff0c;洗地机的出现完美地解决了这一问题&#xff0c;将…

【C++进阶之路】初始C++语法(下)

文章目录 一.引用1.基本概念2.使用场景函数参数函数返回值 3.优点4.指针与引用的区别 二.内联函数引入1.默认设置2.建议3.声明与定义&#xff08;不同文件&#xff09;add.cppadd.htest.cpp 三.auto1.必须有初始值2.只能确定一个类型3.auto可以为类型的一部分4.函数参数和自定义…

Ubuntu20.04部署YOLOv5

目录 前言一、环境配置1 显卡驱动安装1.1 卸载显卡驱动1.2 准备工作1.3 驱动安装1.4 验证 2 CUDA安装2.1 准备工作2.2 CUDA下载2.3 CUDA安装2.4 配置环境变量2.5 验证2.6 小结 3 cuDNN安装3.1 cuDNN下载3.2 cuDNN安装3.3 小结 4 TensorRT安装4.1 TensorRT下载4.2 TensorRT安装4…

UOS-----本地YUM源配置

1. cd /etc/apt/sources.list.d/ 将文件中的两个list配置文件内容注释掉&#xff0c;并保存 2. cd /etc/apt/ vi sources.list 将配置文件内容注释 3. cd /etc/apt/sources.list.d/ vi local.list (创建一个新的list文件&#xff0c;作为本地yum配置文件) 添…

电脑怎么压缩图片大小,4个通用方法分享

电脑怎么压缩图片大小&#xff1f;我相信这个问题很多小伙伴都遇到过的。我们压缩图片大小的主要原因是为了优化网站、应用程序或移动设备的性能。大尺寸的图片文件需要更多的存储空间和带宽&#xff0c;这将导致网页加载速度变慢&#xff0c;浪费用户时间并影响用户体验。此外…

香港科技大学有什么好的专业?

香港科技大学创办于1991年10月&#xff0c;是一所坐落于香港清水湾半岛的公立研究型大学。大学设有4个学院&#xff1a;工学院、理学院、人文社会科学学院和工商管理学院&#xff0c;还设有2个研究院&#xff1a;香港科技大学公共政策和行政研究生院和香港科技大学霍英东研究院…