【设计模式-适配】

ops/2024/9/24 5:34:00/

Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性。

核心思想

适配器模式的核心思想是“将一个类的接口转换成客户期望的另一个接口”,使得两个不兼容的接口能够相互合作。适配器模式可以将现有类的接口与客户端所需的接口进行匹配,达到接口兼容的目的。

组成部分

  • Target(目标接口): 这是客户端期望的接口,通常是你希望进行适配的接口。目标接口可以是一个抽象类或接口。

  • Adaptee(适配者): 这是需要适配的已有接口,可能是一个已经存在的类或接口。适配者类具有客户端需要的功能,但接口与目标接口不兼容。

  • Adapter(适配器): 适配器类实现了目标接口,并持有一个适配者对象的引用。它通过将目标接口的方法委托给适配者对象,实现了接口的转换。

UML图

在这里插入图片描述

Java代码

以下是一个简单的 Java 示例,展示了如何实现适配器模式。假设我们有一个旧版的 OldPrinter 类,它的接口不符合客户端的要求,而客户端需要一个符合 Printer 接口的类。

java">// Target
interface Printer {void print(String text);
}// Adaptee
class OldPrinter {public void printDocument(String text) {System.out.println("Printing document: " + text);}
}// Adapter
class PrinterAdapter implements Printer {private OldPrinter oldPrinter;public PrinterAdapter(OldPrinter oldPrinter) {this.oldPrinter = oldPrinter;}@Overridepublic void print(String text) {oldPrinter.printDocument(text);}
}// Client
public class AdapterPatternExample {public static void main(String[] args) {OldPrinter oldPrinter = new OldPrinter();Printer printer = new PrinterAdapter(oldPrinter);// Client uses Printer interfaceprinter.print("Hello, Adapter Pattern!");}
}

解释

  • Target(Printer): 这是客户端所期望的接口,它定义了 print 方法。

  • Adaptee(OldPrinter): 这是现有的接口,它定义了 printDocument 方法,这个方法的接口与 Printer 不兼容。

  • Adapter(PrinterAdapter): 适配器类实现了 Printer 接口,并持有一个 OldPrinter 对象。适配器的 print 方法将调用 OldPrinter 的 printDocument 方法,从而实现了接口的适配。

优点

  • 兼容性: 使得原本不兼容的接口可以协同工作,扩展了类的功能。

  • 提高复用性: 适配器模式可以将现有的类与新的接口结合,复用现有的类功能而不需要修改它们。

  • 简化客户端代码: 客户端代码只需要依赖目标接口,而不需要关心适配者的细节。

缺点

  • 增加复杂性: 适配器模式可能会引入额外的适配器类,使得系统的复杂性增加。

  • 性能开销: 由于适配器需要做额外的接口转换,可能会有一定的性能开销。

使用场景

  • 旧系统与新系统的集成: 当你需要将一个旧系统与一个新系统进行集成,但它们的接口不兼容时,适配器模式可以帮助你实现这一点。

  • 第三方库的集成: 在使用第三方库时,库的接口可能与应用的需求不一致,适配器模式可以用来解决接口不匹配的问题。

  • 接口转换: 需要将接口从一种形式转换为另一种形式时,比如在不同的模块之间进行通信。

实现方式

  • 类适配器: 通过继承方式实现适配器模式。这种方式需要利用多重继承(在 Java 中通过组合实现),适配器类继承了适配者,并实现了目标接口。

  • 对象适配器: 通过组合方式实现适配器模式。适配器类持有一个适配者对象的引用,并实现目标接口,适配器类将目标接口的请求委托给适配者对象处理。

总结

适配器模式通过引入适配器,将不兼容的接口转换为客户端所期望的接口,从而实现接口的兼容性。这种模式可以使系统更加灵活,减少系统的耦合,提高复用性。适配器模式特别适用于集成不兼容的接口或者引入已有的类库时。


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

相关文章

【Android Studio】app:compileDebugJavaWithJavac FAILED解决办法

文章目录 问题描述解决办法 问题描述 Task :app:compileDebugJavaWithJavac FAILED The following annotation processors are not incremental: jetified-butterknife-compiler-10.0.0.jar (com.jakewharton:butterknife-compiler:10.0.0). Make sure all annotation processo…

【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存

🎬【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏…

数据分析入门

数据分析入门 一、pandas加载数据 1、根据列加载数据 格式 df对象[列名] df对象.列名例如 # 场景1: 加载1列数据. # 格式: df[列名] 或者 df.列名 df[country] df.country# 场景2: 加载多列数据. # 格式: df[[列名1, 列名2...]] df[[country, year, lifeExp]]2、根据行加载数…

dockerfile案例

dockerfile构建nginx FROM centos:7 RUN rm -rf /etc/yum.repos.d/* ADD Centos-7.repo /etc/yum.repo.d/ ADD epel-7.repo /etc/yum.repo.d/ RUN yum -y install nginx EXPOSE 80 CMD ["/usr/sbin/nginx","-g","daemon off;"]dockerfile构建ng…

Spring Boot文件上传/下载问题

在现代的 Web 应用程序中,文件上传和下载是非常常见的功能。Spring Boot 提供了非常简便和强大的解决方案来处理文件上传和下载。虽然基本功能很容易实现,但在实际项目中,文件大小限制、并发上传、文件类型验证、安全性等问题也常常需要重点考…

【计算机网络 - 基础问题】每日 3 题(二十)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

K8S容器实例Pod安装curl-vim-telnet工具

在没有域名的情况下,有时候需要调试接口等需要此工具 安装curl、telnet、vim等 直接使用 apk add curlapk add vimapk add tennet

统信服务器操作系统【开机自启动】配置方法

开机自启动的四种配置方法,包括systemctl命令、rc.local文件、crontab任务,通过desktop配置开机自动,前三种方法适合后台程序或者脚本启动,最后一种方法适合图形化程序启动。 文章目录 准备环境配置方法一、通过编写service的方法,使用systemctl配置开机自启二、通过rc.lo…