适配器模式(Adapter Pattern)

简介: 适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使原本接口不兼容的类可以一起工作。它包括目标接口、适配者和适配器三个核心角色。适配器模式常用于解决旧系统兼容性问题、第三方库整合和统一接口等场景。该模式有类适配器和对象适配器两种实现方式,分别通过继承和组合实现。适配器模式的优点包括提高兼容性、遵循开闭原则和灵活性高,但也存在适配器数量增加导致复杂性和可能影响性能的缺点。

适配器模式(Adapter Pattern)详解

定义

适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。适配器模式又称“包装器(Wrapper)”。


适配器模式的结构

核心角色

  1. 目标接口(Target)
    定义客户需要的接口,是客户代码直接调用的接口。
  2. 适配者(Adaptee)
    现有的接口,无法直接满足客户需求。
  3. 适配器(Adapter)
    将适配者的接口转换为目标接口,使客户可以通过目标接口访问适配者。

适配器模式的使用场景

  1. 旧系统的兼容性问题:当需要使用一个已有系统,但它的接口与新系统不兼容时,可以通过适配器模式进行适配。
  2. 第三方库整合:当使用第三方库的接口与当前项目需求不一致时,可以通过适配器封装以符合需求。
  3. 统一接口:在多种类似功能的接口中,适配器可以对不同实现进行封装,提供统一的访问接口。

适配器模式的优缺点

优点

  1. 提高兼容性:使原本不兼容的类可以协同工作。
  2. 遵循开闭原则:通过添加适配器实现扩展,无需修改原有代码。
  3. 灵活性高:可以动态添加新的适配器以支持不同的接口。

缺点

  1. 过多适配器增加复杂性:如果需要适配的类很多,适配器数量可能会迅速增长,导致系统复杂性提升。
  2. 可能影响性能:适配器的额外封装会引入一定的性能开销。

适配器模式的两种实现方式

  1. 类适配器(使用继承):适配器继承适配者类,并实现目标接口。
  2. 对象适配器(使用组合):适配器中包含适配者对象的引用,通过委托实现适配。

类适配器与对象适配器的比较

特性 类适配器 对象适配器
实现方式 使用继承 使用组合
适配者数量 只能适配一个类 可以适配多个适配者
灵活性 较低,受限于单继承 较高,适配器与适配者松耦合
扩展性 需要创建子类 不需要修改适配器类即可扩展

使用案例

案例 1:图形绘制系统

现有一个老版本的绘图类 LegacyRenderer,需要将其适配到新的绘图接口 NewRenderer,以兼容新功能。

案例 2:支付系统整合

整合多个第三方支付接口(如 PayPal、Stripe)到统一的支付系统中。

案例 3:硬件设备驱动

将不同厂商的硬件设备接口统一适配为系统标准接口。


适配器模式的类图

适配器模式的实现

C++ 实现

#include <iostream>
using namespace std;

// 目标接口
class Target {
public:
   virtual void Request() const {
       cout << "Target: Default implementation of Request" << endl;
   }
   virtual ~Target() = default;
};

// 适配者
class Adaptee {
public:
   void SpecificRequest() const {
       cout << "Adaptee: SpecificRequest called" << endl;
   }
};

// 适配器
class Adapter : public Target {
private:
   Adaptee* adaptee;
public:
   Adapter(Adaptee* adaptee) : adaptee(adaptee) {}
   void Request() const override {
       adaptee->SpecificRequest();
   }
};

// 客户端代码
void ClientCode(const Target* target) {
   target->Request();
}

int main() {
   cout << "Client: I can work just fine with the Target objects:\n";
   Target* target = new Target;
   ClientCode(target);

   cout << "\nClient: The Adapter makes the Adaptee's interface compatible:\n";
   Adaptee* adaptee = new Adaptee;
   Target* adapter = new Adapter(adaptee);
   ClientCode(adapter);

   delete target;
   delete adaptee;
   delete adapter;

   return 0;
}


C# 实现

using System;

// 目标接口
public interface ITarget {
   void Request();
}

// 适配者
public class Adaptee {
   public void SpecificRequest() {
       Console.WriteLine("Adaptee: SpecificRequest called");
   }
}

// 适配器
public class Adapter : ITarget {
   private readonly Adaptee _adaptee;

   public Adapter(Adaptee adaptee) {
       _adaptee = adaptee;
   }

   public void Request() {
       _adaptee.SpecificRequest();
   }
}

// 客户端代码
class Program {
   static void Main(string[] args) {
       Console.WriteLine("Client: I can work with Target interface:");
       ITarget target = new Adapter(new Adaptee());
       target.Request();
   }
}


适配器模式的总结

  • 应用场景:适配器模式适用于系统接口不兼容,但必须协同工作的场景。
  • 实现选择:类适配器在需要直接继承的情况下使用,对象适配器适用于松耦合场景。
  • 灵活性:适配器可以动态适配多个不同的接口,从而提供更灵活的解决方案。
  • 关键点:实现中要注意目标接口与适配者接口之间的功能映射关系,以避免错误适配。
相关文章
|
自然语言处理 监控 算法
|
10月前
|
自然语言处理 搜索推荐 数据可视化
49_选择框架:任务类型与模型匹配
在大语言模型(LLM)应用开发的早期阶段,选择合适的模型架构和框架往往是项目成功的关键第一步。随着2025年LLM技术的快速发展,市场上可用的模型和框架数量激增,如何基于特定任务类型选择最匹配的解决方案成为开发者面临的重要挑战。本文将深入探讨任务类型与LLM模型匹配的方法论,重点介绍基于决策树的模型选择框架,并通过实际代码示例演示如何构建和应用这一框架。
709 0
|
10月前
|
数据采集 存储 自然语言处理
113_数据收集:Common Crawl过滤与高质量LLM训练数据构建
在大型语言模型(LLM)的训练过程中,数据质量直接决定了模型的性能上限。即使拥有最先进的模型架构和训练算法,如果没有高质量的训练数据,也难以训练出优秀的语言模型。Common Crawl作为目前互联网上最大的公开网络爬虫数据集之一,为LLM训练提供了宝贵的资源。然而,从原始的Common Crawl数据中提取高质量的训练素材并非易事,需要经过严格的过滤和清洗。本文将全面探讨Common Crawl数据集的特性、过滤策略的设计原则、以及2025年最新的过滤技术,为构建高质量的LLM训练语料提供系统指导。
1390 0
|
Java API 开发工具
如何将python应用编译到android运行
【6月更文挑战第27天】本文介绍在Ubuntu 20上搭建Android开发环境,包括安装JRE/JDK,设置环境变量,添加i386架构,安装依赖和编译工具。并通过`p4a`命令行工具进行apk构建和清理。
823 6
如何将python应用编译到android运行
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,2核8G、4核16G、8核32G最新收费标准
阿里云服务器2核8G、4核16G、8核32G配置租用价格参考,2024年阿里云产品再一次降价,降价之后2核8G配置按量收费最低收费标准为0.3375元/小时,按月租用标准收费标准为136.0元/1个月。4核16G配置的阿里云服务器按量收费标准最低为0.675元/小时,按月租用标准收费标准为272.0元/1个月。8核32G配置的阿里云服务器按量收费标准最低为1.35元/小时,按月租用标准收费标准为544.0元/1个月。云服务器实例规格的地域和实例规格不同,收费标准不一样,下面是2024年阿里云服务器2核8G、4核16G、8核32G配置的最新租用收费标准。
阿里云服务器租用价格参考,2核8G、4核16G、8核32G最新收费标准
|
XML 数据格式
htmlparser2.js:一个快速宽松的HTML/XML解析器
htmlparser2.js:一个快速宽松的HTML/XML解析器
1350 0
|
机器学习/深度学习 人工智能 自然语言处理
软件测试的未来趋势:AI与自动化的融合
随着技术的不断进步,软件测试领域正迎来一场革命。本文将探讨人工智能(AI)和自动化技术如何共同推动软件测试的发展,提高测试效率,减少人为错误,并预测未来的发展趋势。通过分析当前市场上流行的测试工具和方法,以及它们如何整合AI和自动化技术,我们将揭示这一领域即将迎来的变革。
860 29
|
设计模式 安全 C#
单例模式详解
单例模式是一种常用的创建型设计模式,确保某个类只有一个实例,并提供一个全局访问点。本文详细介绍了单例模式的定义、特点、适用场景、优缺点及实现代码(C++ 和 C#),并探讨了线程安全的实现细节和与依赖注入的结合使用。
|
安全 Java
Logback 实现日志链路追踪
Logback 实现日志链路追踪
570 1