适配器模式(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();
   }
}


适配器模式的总结

  • 应用场景:适配器模式适用于系统接口不兼容,但必须协同工作的场景。
  • 实现选择:类适配器在需要直接继承的情况下使用,对象适配器适用于松耦合场景。
  • 灵活性:适配器可以动态适配多个不同的接口,从而提供更灵活的解决方案。
  • 关键点:实现中要注意目标接口与适配者接口之间的功能映射关系,以避免错误适配。
相关文章
LSTM+Transformer混合模型时间序列预测实战教学
LSTM+Transformer混合模型时间序列预测实战教学
1751 0
|
Java 开发工具 git
spring源码下载、编译、debug的详细教程
spring源码下载、编译、debug的详细教程
1803 0
spring源码下载、编译、debug的详细教程
|
设计模式 安全 C#
单例模式详解
单例模式是一种常用的创建型设计模式,确保某个类只有一个实例,并提供一个全局访问点。本文详细介绍了单例模式的定义、特点、适用场景、优缺点及实现代码(C++ 和 C#),并探讨了线程安全的实现细节和与依赖注入的结合使用。
|
4月前
|
数据采集 存储 自然语言处理
113_数据收集:Common Crawl过滤与高质量LLM训练数据构建
在大型语言模型(LLM)的训练过程中,数据质量直接决定了模型的性能上限。即使拥有最先进的模型架构和训练算法,如果没有高质量的训练数据,也难以训练出优秀的语言模型。Common Crawl作为目前互联网上最大的公开网络爬虫数据集之一,为LLM训练提供了宝贵的资源。然而,从原始的Common Crawl数据中提取高质量的训练素材并非易事,需要经过严格的过滤和清洗。本文将全面探讨Common Crawl数据集的特性、过滤策略的设计原则、以及2025年最新的过滤技术,为构建高质量的LLM训练语料提供系统指导。
|
11月前
|
NoSQL Java Redis
springboot怎么使用Redisson
通过以上步骤,已经详细介绍了如何在Spring Boot项目中使用Redisson,包括添加依赖、配置Redisson、创建配置类以及使用Redisson实现分布式锁和分布式集合。Redisson提供了丰富的分布式数据结构和工具,可以帮助开发者更高效地实现分布式系统。通过合理使用这些工具,可以显著提高系统的性能和可靠性。
3732 34
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,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最新收费标准
|
设计模式 Java
Java责任链模式
Java责任链模式
255 0
|
设计模式 监控 数据库
代理模式(Proxy Pattern)
代理模式(Proxy Pattern)是一种设计模式,通过一个中间对象(代理)来间接访问目标对象,以控制访问权限或添加额外功能。常见的代理类型包括远程代理、虚拟代理、保护代理和智能引用代理。代理模式常用于延迟加载、权限控制、日志记录等场景,能够提高系统的灵活性和安全性。
|
设计模式 API C#
桥接模式(Bridge Pattern)
桥接模式是一种结构型设计模式,通过将抽象部分与实现部分分离,使它们可以独立变化,从而提高系统的灵活性和扩展性。主要角色包括抽象化、扩展抽象化、实现和具体实现。适用于多变化维度的系统,如跨平台开发、图形系统等。优点是分离抽象与实现,减少子类数量;缺点是增加了复杂性和理解难度。
|
设计模式 数据安全/隐私保护
责任链模式实战:在项目中的应用与技巧
在软件工程中,责任链模式(Chain of Responsibility)是一种对象行为型设计模式,它允许多个对象有机会处理请求,从而避免请求发送者与接收者之间的耦合。这种模式在处理复杂的业务逻辑和系统解耦方面非常有用。本文将探讨责任链模式的基本概念、应用场景以及在实际项目中的应用技巧。
352 4