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

embedded/2024/9/24 7:52:19/

一、适配器模式简介

适配器模式(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.ppmy.cn/embedded/97755.html

相关文章

【TCP】确认应答、超时重传机制和TCP报头

TCP 相关机制 TCP 基本特点&#xff1a;有连接、可靠传输、面向字节流、全双工 有连接、面向字节流和全双工都能在前面的代码中体现有连接&#xff1a;必须要先调用 accept 建立联系才能处理面向字节流&#xff1a;会拿到 clientSocket 对象的 InputStream 和 OutputStream&a…

HarmonyOS 开发

环境 下载IDE 代码 import { hilog } from kit.PerformanceAnalysisKit; import testNapi from libentry.so; import { router } from kit.ArkUI; import { common, Want } from kit.AbilityKit;Entry Component struct Index {State message: string Hello HarmonyOS!;p…

回顾前面刷过的算法(6)

今天回顾一下这几道算法 //最小栈//思路&#xff1a; 定义一个带有val、min、next 三个属性的节点&#xff0c;其中min表示除当前节点外剩余节点中最小的节点值&#xff0c;//以链表的形式存储节点&#xff0c;每次push节点都是插入到root后一个节点&#xff0c;删除也是root后…

认识微服务

什么是微服务&#xff1f; 微服务是一种软件架构风格&#xff0c;它将一个大型的应用程序拆分成一组小的、自治的服务单元。每个服务单元都运行在独立的进程中&#xff0c;通过轻量级的通信机制&#xff08;如HTTP/RESTful API、消息队列等&#xff09;进行交互&#xff0c;并且…

C++观察者模式:订阅博主~

目录 观察者模式步骤例子&#xff1a;订阅博主UML图1&#xff1a;定义观察者接口2&#xff1a;定义被观察者接口3&#xff1a;创建具体观察者类4&#xff1a;创建具体被观察者类5&#xff1a;使用执行结果 观察者模式 观察者模式允许我们定义一种订阅机制&#xff0c;可在对象…

C#使用onnxruntime加载模型,部署到别人的PC上报错

C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错解决方案 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错&#xff1a; Sys…

UE5.4 用自带OpenCV4.55读取png、MP4、摄像头并在ui中显示的方法

创建c项目&#xff0c;项目build.cs中开启模块&#xff1a; // Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class OpencvT : ModuleRules {public OpencvT(ReadOnlyTargetRules Target) : base(Target){PCHUsage PCHUsageMode.UseExplici…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…