设计模式--适配器模式

ops/2024/10/23 11:24:15/
引言

在软件开发中,适配器模式(Adapter Pattern) 是一种结构型设计模式,其核心思想在于将一个接口转换为客户期望的另一个接口,使得原本由于接口不兼容而无法协同工作的类能够一起工作。适配器模式主要用于解决两个类之间的接口不匹配问题,它通过包装一个类的接口,将其转换为客户所期待的另一种接口形式,从而达到兼容的目的。

应用场景
  • 当你需要使用现有类,但其接口不符合你的需求时。
  • 当你想复用一些旧的系统,但它们的接口与新系统不兼容时。
  • 需要创建一个统一的接口来处理多种不同类型的对象,而又不想修改这些对象时。
使用技巧与注意事项
  • 单一职责原则:适配器类应当专注于接口转换,尽量保持其简洁,不要添加过多业务逻辑。
  • 灵活性适配器模式提供了很好的灵活性,允许在运行时动态选择适配器类型,以适应不同情况。
  • 避免过度设计:仅在确实存在接口不兼容问题时使用适配器模式,过度使用可能导致系统复杂度上升。
  • 考虑使用对象适配器还是类适配器:类适配器通过继承实现,而对象适配器通过组合实现,后者更为灵活,因为它允许一个适配器同时适配多个接口。
C++代码示例

假设我们有两个接口:Target是我们期望的目标接口,而Adaptee是已有的、需要适配的接口。我们将通过对象适配器的方式展示适配器模式的实现。

#include <iostream>// 目标接口
class Target {
public:virtual ~Target() {}virtual void request() = 0;
};// 已有接口(需要被适配)
class Adaptee {
public:void specificRequest() {std::cout << "Adaptee's specific request handling." << std::endl;}
};// 适配器类,通过组合方式适配Adaptee到Target接口
class Adapter : public Target {
private:Adaptee* adaptee;
public:Adapter(Adaptee* a) : adaptee(a) {}~Adapter() { delete adaptee; }void request() override {std::cout << "Adapter converting the call..." << std::endl;adaptee->specificRequest();}
};int main() {// 创建Adaptee对象Adaptee* adaptee = new Adaptee();// 创建Adapter对象,适配Adaptee到Target接口Target* target = new Adapter(adaptee);// 通过Target接口调用,实际上执行的是Adaptee的功能target->request();delete target; // 清理资源return 0;
}

在这个例子中,Target接口代表客户端期望的接口,而Adaptee则拥有实际的功能但接口不符。Adapter类通过组合Adaptee对象,并实现了Target接口,从而使得Adaptee能够满足客户端的需求,实现了接口的适配。

适配器模式不仅在C++中应用广泛,在Java、Python等其他语言中同样有着重要的地位,是解决系统兼容性和扩展性问题的有效手段。正确应用适配器模式,可以显著提升软件的灵活性和可维护性。


http://www.ppmy.cn/ops/41663.html

相关文章

数据结构——二叉树知识点详解!

引言&#xff1a;本篇博客将详细介绍到数据结构中的又一位大将——二叉树。它也是我们目前学到的第一个非线性的数据结构。并且本章将学到的概念居多&#xff0c;希望大家可以理解并牢记。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 目录 一&#xff0…

实现腾讯地图的接口调用以及微信小程序的地图标注

目录 微信小程序端1. 引入腾讯地图SDK2. 使用地图组件3. 地图页面编写4. 地图标注 Java后端业务逻辑1. 引入腾讯地图Java SDK2. 配置API密钥3. 调用腾讯地图API4. 提供小程序调用的接口 总结 要实现腾讯地图的接口调用以及微信小程序的地图标注&#xff0c;需要分为两个部分&am…

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十六&#xff09; 一、SpringCloudStream&#xff1a;自定义消息通道 1、在子工程 stream_product &#xff08;子模块&#xff09;中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

大学生须知~~毕业季行李轻松寄,怎么邮寄行李省钱!

毕业季即将到来&#xff0c;告别母校告别这座城市&#xff0c;肯定恋恋不舍&#xff0c;这几年的学生生涯也留下了不少行李。怎么邮寄才便宜呢&#xff1f;&#xff1f; 记得找惠发快递呀&#xff01;因为我们平台是跟快递总部合作的&#xff0c;不管你寄大件还是快递都很便宜…

王道c语言-文件操作

fopen fgetc fputc fwrite fread fgets fputs //main.c #include <stdio.h> #include <string.h>int main() {FILE *fp;int ret;//打开/创建文件fp fopen("test.txt", "wb");if (NULL fp) {perror("fopen fail");//perror aim to…

google test 使用指南

目录 测试项目 calculator.h calculator.cpp test01.cpp 创建新项目 选择Google Test 选择要测试的项目 pch.cpp 加入依赖 设为启动项目 ​编辑 运行 ​编辑 关键点 测试项目 calculator.h #ifndef __CALCULATOR_H__ #define __CALCULATOR_H__#include <i…

深化产教融合,泰迪智能科技助力西南林业大学提质培优

2024年5月7日&#xff0c;泰迪智能科技昆明分公司院校部总监查良红和数据部负责人余雄亮赴西南林业大学理学院就工作室共建事宜进行交流会谈。西南林业大学理学院院长张雁、党委副书记魏轶、副院长谢爽、就业负责人罗丽及学生代表参与本次交流会。 会议伊始&#xff0c;谢副院长…

【Linux】Centos9设置ActiveMq开机自启功能

配置流程&#xff1a; 1. 创建 Systemd 服务文件。这个文件通常存放在/usr/lib/systemd/system/目录下&#xff0c;命名为 activemq.service。 #先创建文件&#xff0c;然后编辑&#xff1a; sudo touch /usr/lib/systemd/system/activemq.service sudo vim /usr/lib/systemd…