08结构型设计模式——适配器模式

news2024/12/26 1:12:29

一、适配器模式简介

适配器模式(Adapter Pattern)是结构型设计模式之一,用于将一个类的接口转换成客户希望的另一个接口。这个模式使得原本接口不兼容的类可以在一起工作。适配器模式的核心目的是实现接口兼容性,使得系统能够使用原本不兼容的类。

GoF一书对适配器模式的介绍

二、适配器模式的关键要点

  1. 适配器(Adapter):充当客户端与目标接口之间的桥梁。它实现了客户端期望的接口,并将请求委托给被适配的对象。

  2. 目标接口(Target Interface):客户端期望使用的接口。

  3. 被适配者(Adaptee):已有的类,它的接口与客户端期望的接口不兼容。

  4. 客户端(Client):使用目标接口的代码。

三、 适配器模式的用处

1. 接口不兼容

当你有一个现有的类,其接口与客户端所期望的接口不匹配时,适配器模式可以帮助将这两个接口连接起来。这样,你可以在不修改现有代码的情况下,使得这些不兼容的接口能够协同工作。

2. 代码重用

通过适配器模式,你可以重用已有的类,而不需要对它们进行修改。适配器模式允许你将现有类包装在适配器中,从而使其能够与新的系统或接口兼容。这有助于提高代码的重用性,减少重复工作。

3. 系统集成

在集成不同系统或模块时,可能会遇到接口不兼容的问题。适配器模式可以作为桥梁,将不同系统之间的接口进行转换,使它们能够互操作。这对于系统之间的兼容性和集成非常重要。

4. 第三方库的兼容

在使用第三方库时,这些库可能与项目中的接口不兼容。通过适配器模式,可以创建一个适配器类,将第三方库的接口适配为项目所需的接口,从而使得库能够被有效地使用。

5. 引入新功能

当系统需要引入新的功能,但这些功能的接口与现有接口不兼容时,可以使用适配器模式将新功能的接口适配到现有系统中。这样,你可以无缝地将新功能集成到系统中,而无需大规模修改现有代码。

实际应用示例:

  • 用户界面(UI)组件的适配:如果你使用了多个 UI 库或组件,这些组件可能具有不同的接口。适配器模式可以将这些组件的接口适配成统一的接口,从而简化 UI 组件的使用。

  • 数据存储接口的适配:在数据存储系统中,不同的数据存储库(如数据库、文件系统等)可能有不同的访问接口。适配器模式可以将这些存储库的接口适配成统一的数据访问接口。

  • API 接口的适配:当你集成外部 API 时,这些 API 可能具有与项目中现有接口不同的设计。使用适配器模式,可以将外部 API 的接口转换为项目需要的接口。

四、适配器模式的设计方法

adapter.cpp

#include <iostream>

// 图形编辑器接口
class Shape {
public:
    virtual ~Shape() = default;
    virtual void draw() const = 0;
};

// 第三方库中的类
class Triangle {
public:
    void renderTriangle() const {
        std::cout << "Drawing a triangle" << std::endl;
    }
};

// 适配器
class TriangleAdapter : public Shape {
public:
    TriangleAdapter(const Triangle& triangle) : triangle_(triangle) {}

    void draw() const override {
        triangle_.renderTriangle();  // 调用被适配者的接口
    }

private:
    const Triangle& triangle_;
};

// 客户端代码
void doWorking() {
    // 创建第三方库的三角形对象
    Triangle triangle;
    
    // 使用适配器将三角形适配为 Shape 接口
    TriangleAdapter triangleShape(triangle);
    
    // 使用统一的接口绘制图形
    triangleShape.draw();
}

int main() {
    doWorking();
    return 0;
}

运行效果

五、总结

 适配器模式的本质是将一个类的接口转换为客户端所希望的另外一个接口。比如手机适配器的工作电压组合各不相同,有5V/1A、5V/2A、9V/2A 、 12V/1.5A、5V/3A、9V/3A、12V/3A 和 20V/5A甚至包括无线充电也有不同的工作电压/电流组合,工作电压和电流的组合出于性能和安全为由各不相同,搞一个适配器让其根据手机的不同配置要求限制电压/电流范围,这样客户没带适配器,用别人的适配器也可以用啦,像90年代的万能充电器一样!所以适配器实际上就是为了解决接口不兼容的问题。

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

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

相关文章

C/C++软件逆向:IDA基本使用

这篇文章主要来说一下IDA的基本使用&#xff0c;那么在此之前先来准备一个简单的程序&#xff0c;作为IDA使用的实例。VS 创建一个C项目&#xff0c;并设置项目属性&#xff1a;设置运行库为MTd&#xff08;默认是MDd&#xff09; 运行库选项区别&#xff1a; 在Visual Studio…

Git使用速通

目录 一、Git相关配置系统配置文件存放处用户配置文件所在地用户名称和e-mail地址 二、初始化仓库git init——初始化仓库git status——查看仓库的状态git add——向暂存区中添加文件git commit——保存仓库的历史记录 三、版本回退与文件修改git log——查看提交日志git refl…

基于Java的线上售楼系统的设计与实现(论文+源码)_kaic

摘 要 现代化的线上售楼管理正在逐渐成为现代社会的重要需求&#xff0c;而目前的线上售楼由于存在管理不规范等缺点&#xff0c;严重制约了楼房和房地产公司的发展&#xff0c;建设一个更加规范化的线上售楼系统是十分迫切需要的。为此&#xff0c;使用Java语言&#xff0c;S…

leetCode - - - 双指针

目录 1.寻找重复数&#xff08;LeetCode 287&#xff09; 解法一&#xff1a;二分查找 解法二&#xff1a;快慢指针 2.验证回文串&#xff08;LeetCode 125&#xff09; 3.三数之和&#xff08;LeetCode 15&#xff09; 4.四数之和&#xff08;LeetCode 18&#xff09; …

Unity 麦扣 x 勇士传说 全解析 之 怪物基类与野猪(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

通过一阵子的学习&#xff0c;我是这么认为的&#xff0c;因为该教程是难度两星的教程 &#xff0c;也就是适合学了一阵子基础组件以后的学习者 &#xff08;什么都不会的学习者要是学这套课程会困难重重&#xff0c;如果你什么都不会那么需要学习一星教程&#xff09; 所以该…

基于asp.net的webform框架的校园点餐系统源码

今天给大家分享一套基于asp.net的webform框架的网页点餐系统&#xff0c;适合课程设计参考及其自己学习&#xff0c;需要的小伙伴自己参考下&#xff0c;下载链接我放在后面了 主要功功能 系统的主要功能包含&#xff1a;前端点餐页面、加入购物车、商品食物浏览、我的购 物车…

ffmpeg开发者视频剪辑器

5G 时代的来临&#xff0c;加速了视频类作品的创作&#xff0c;由于现在的流量越来越便宜&#xff0c;网速越来越快&#xff0c;特别是流量无限用套餐&#xff0c;大家更愿意去看视频作品&#xff0c;特别是抖音的兴起&#xff0c;更是加速了小视频的流量。不会剪辑的我们该如何…

windows安装android studio

下载 https://developer.android.google.cn/studio?hlzh-cn 安装 打开cmd输入如下命令 android-studio-2024.1.1.12-windows.exe /NCRC 注意 运行命令后可能还报错&#xff0c;但是会出现弹窗 如果还是报错可以选择zip 运行 不设置代理 等待下载即可&#xff0c;…

SAP LE学习笔记04 - MM与WM跨模块收货到仓库的流程中 如何既创建TR又同时立即在前台创建TO

上一章讲了在MM模块的IM(在库管理)中收货到仓库的流程,以及关联WM移动Type与IM移动Type。 SAP LE学习笔记03 - 在IM(在库管理)中收货到仓库的流程&#xff0c;关联 WM移动Type与IM移动Type-CSDN博客 本章继续将LE的其他知识。 - MM与WM跨模块收货到仓库的流程中&#xff0c;如…

深入探索Amazon EC2:解锁云端计算的无限可能

欢迎来到本次的实验教程&#xff0c;这将引导您在功能强大且充满活力的 Amazon Web Services (AWS) 云中启动并配置虚拟机。 在本次实验中&#xff0c;您将亲身体验如何利用 Amazon 机器映像 (AMI) 启动 Amazon EC2 实例&#xff0c;并掌握使用密钥对进行 SSH 认证登录实例的技…

第18 章探讨 C++新标准.可变参数模板,模板和函数参数包,展开参数包

第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包 第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包 文章目录 第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包18.6 可变参数模板18.6.1 模板和函数参数包18.6.2 展开参数包18.6.3 …

Bootstrap个人技术博客响应式网页模板

Bootstrap个人技术博客响应式模板基于Bootstrap3.3.5制作&#xff0c;自适应分辨率&#xff0c;兼容PC端和移动端&#xff0c;全套模板&#xff0c;包括首页、关于、网页配色、内容页、友情链接、读者墙、标签云、点赞等网站模板页面。模板下载地址http://m.bokequ.com/moban/1…

我在高职教STM32——I2C通信之SHT20传感器(2)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

ubuntu基于sealos搭建k8s集群,helm3安装配置自动化扩容Prometheus,grafana出图展示,以及动态web搭建

1.项目简介 大方向&#xff1a;k8s云原生方向&#xff0c;运维技术&#xff0c;配置问题解决 解决技术:ubuntu模板机安装&#xff0c;配置远程xshell连接ubuntu&#xff0c;设置静态ip&#xff0c;换ubuntu阿里云源&#xff0c;配置集群间域名解析&#xff0c;解决双IP冲突网…

I2C的10-bit地址空间

10-bit地址空间&#xff1a; I2C支持 10-bit的设备地址&#xff0c;此时的时序如下图所示&#xff1a; 在 10-bit地址的 I2C系统中&#xff0c;需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110&#xff0c;后接 slave地址的高 2位&#xff0c;第 8位仍然是 …

牛客面经学习笔记(四)

这种拨码开关在PLC里面很是常用&#xff1a; 这种弧型线就很漂亮&#xff1a; 这个白色按键很漂亮&#xff1a; 快恢复保险丝&#xff1a; 继电器电路&#xff1a; 这里的续流二极管很重要&#xff0c;因为继电器是感性元件&#xff1a; 【【必考】5招搞清楚&#xff01;单点接…

关于pytorch后续学习需要下载的包太慢怎么办?tensorboard为例

启发&#xff1a; anaconda python3.7安装TensorFlow 1.9.0&#xff08;CPU版&#xff09; 和这个佬的 我是CPU版本&#xff08;好像是需要找anaconda对应版本&#xff0c;我不知道咋找版本&#xff0c;不知道不同版本的对应关系&#xff09; 此时&#xff0c;我们可以浅浅pip…

民航网上订票系统设计和实现--论文pf

TOC springboot427民航网上订票系统设计和实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和…

【系统分析师】-综合知识-系统架构

1、设计模式 1&#xff09;观察者模式定义了对象间的一种一对多依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中&#xff0c;发生改变的对象称为观察目标&#xff0c;被通知的对象称为观察者&…

泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第二集(加载数据)

此次目的&#xff1a; hello大家好&#xff0c;俺是没事爱瞎捣鼓又分享欲爆棚的叶同学&#xff01;&#xff01;&#xff01;准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程&#xff0c;顺便也将其中所学习到的知识分享出来。这是第一集&#xff08;了解赛题&#x…