当前位置: 首页 > news >正文

设计模式 - 适配器模式

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、适配器模式的基本概念
      • 二、适配器模式的实现
        • 1. 定义目标接口
        • 2. 定义适配者接口
        • 3. 定义具体适配者类
        • 4. 定义适配器类
        • 5. 客户端代码
      • 三、适配器模式的优点
      • 四、适配器模式的缺点
      • 五、适配器模式的应用场景
      • 六、适配器模式的变种
        • 1. 类适配器模式
        • 2. 对象适配器模式
        • 3. 多重适配器模式
      • 七、适配器模式与装饰器模式的区别
      • 八、总结

引言

适配器模式是一种结构型设计模式,它允许不兼容的接口协同工作。通过使用适配器,可以将一个类的接口转换成客户希望的另一个接口。这种模式常常用于解决两个类接口不匹配的问题,使得原本因接口不兼容而不能一起工作的类可以一起工作。本文将详细介绍适配器模式的概念,并通过具体的Java代码示例来说明如何实现这一模式。

一、适配器模式的基本概念

适配器模式的主要参与者包括:

  1. Target:定义了客户端使用的接口。
  2. Adaptee:定义了需要适配的现有接口。
  3. Adapter:通过继承或组合Adaptee来实现Target接口,从而将Adaptee接口转换为Target接口。

二、适配器模式的实现

接下来,我们将通过一个示例来详细了解适配器模式的实现步骤。

1. 定义目标接口

首先,定义目标接口,这是客户端期望使用的接口:

// 目标接口
public interface Target {void request();
}
2. 定义适配者接口

接下来,定义适配者接口,这是需要适配的现有接口:

// 适配者接口
public interface Adaptee {void specificRequest();
}
3. 定义具体适配者类

实现适配者接口,具体适配者类提供了需要适配的方法:

// 具体适配者类
public class ConcreteAdaptee implements Adaptee {@Overridepublic void specificRequest() {System.out.println("ConcreteAdaptee specific request.");}
}
4. 定义适配器类

实现目标接口,适配器类将适配者接口转换为目标接口:

// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
5. 客户端代码

客户端代码使用目标接口来调用适配器类:

public class ClientApplication {public static void main(String[] args) {Adaptee adaptee = new ConcreteAdaptee();Target adapter = new Adapter(adaptee);adapter.request();  // 通过适配器调用适配者的方法}
}

三、适配器模式的优点

  1. 增强灵活性:通过适配器模式,可以轻松地让原本不兼容的接口协同工作。
  2. 符合开闭原则:适配器模式遵循开闭原则,可以在不修改原有代码的基础上增加新的功能。
  3. 简化代码:适配器模式可以简化客户端代码,使其不必关心具体的适配者类。

四、适配器模式的缺点

  1. 类数量增加:适配器模式会增加类的数量,可能会使系统变得更加复杂。
  2. 过度设计:在某些情况下,适配器模式可能导致过度设计。

五、适配器模式的应用场景

适配器模式适用于以下情况:

  1. 系统集成:当需要将第三方库或旧系统中的类集成到现有系统中时。
  2. 接口不兼容:当一个类的接口与另一个类的接口不兼容,但又希望这两个类可以一起工作时。
  3. 兼容性:当需要为一个已经存在的类添加一些额外的功能,但又不想修改原有类时。

六、适配器模式的变种

除了上述的基本适配器模式外,还有以下几种变种:

  1. 类适配器模式:适配器通过继承适配者类来实现目标接口。
  2. 对象适配器模式:适配器通过组合适配者类来实现目标接口。
  3. 多重适配器模式:一个适配器类可以适配多个适配者类。
1. 类适配器模式
// 类适配器模式
public class ClassAdapter extends ConcreteAdaptee implements Target {@Overridepublic void request() {specificRequest();}
}
2. 对象适配器模式
// 对象适配器模式
public class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
3. 多重适配器模式
// 多重适配器模式
public interface Adaptee1 {void specificRequest1();
}public interface Adaptee2 {void specificRequest2();
}public class MultiAdapter implements Target {private Adaptee1 adaptee1;private Adaptee2 adaptee2;public MultiAdapter(Adaptee1 adaptee1, Adaptee2 adaptee2) {this.adaptee1 = adaptee1;this.adaptee2 = adaptee2;}@Overridepublic void request() {adaptee1.specificRequest1();adaptee2.specificRequest2();}
}

七、适配器模式与装饰器模式的区别

适配器模式和装饰器模式都是结构型设计模式,但它们之间存在显著差异:

  1. 目的:适配器模式的目的是让两个不兼容的接口可以协同工作,而装饰器模式的目的是动态地给一个对象添加一些额外的责任。
  2. 适用范围:适配器模式适用于接口不兼容的情况,而装饰器模式适用于需要扩展对象功能的情况。
  3. 设计思想:适配器模式侧重于转换接口,而装饰器模式侧重于添加责任。

八、总结

通过本文的详细介绍和示例代码,相信你应该已经了解了适配器模式的基本实现细节及其在不同情况下的表现。适配器模式是面向对象设计中一种非常有用的模式,特别是在需要让两个不兼容的接口协同工作的情况下。在实际编程中,适配器模式可以用于构建高度可配置和可扩展的系统,尤其是在需要支持多种不同类型的产品时。通过上述实现,你可以根据自己的需求进一步扩展和优化适配器模式的应用。

适配器模式虽然简单,但在设计系统时需要考虑到其潜在的问题,比如类的数量增加等。正确地使用适配器模式可以使你的代码更加健壮和易于维护。


💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

设计模式相关文章索引文章链接
设计模式 - 抽象工厂模式 设计模式 - 抽象工厂模式
设计模式 - 单例模式 设计模式 - 单例模式
设计模式 - 建造者模式 设计模式 - 建造者模式
设计模式 - 原型模式 设计模式 - 原型模式

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

http://www.lryc.cn/news/421330.html

相关文章:

  • docker部署minIO
  • 「Pytorch」BF16 Mixed Precision Training
  • 论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024
  • LLMOps — 使用 BentoML 为 Llama-3 模型提供服务
  • 微软蓝屏事件揭秘:有问题的数据引发内存读取越界
  • NASA:北极ARCTAS差分吸收激光雷达(DIAL)遥感数据
  • Android 文件上传与下载
  • Java语言的充电桩系统Charging station system
  • RCE之无参数读取文件
  • Python GUI开发必看:Tkinter Button控件使用详解
  • 上海市计算机学会竞赛平台2024年7月月赛丙组得分排名
  • Can GPT-3 Perform Statutory Reasoning?
  • redis面试(十一)锁超时
  • C代码做底层及Matlab_SimuLink做应用层设计单片机程序
  • Cloud Kernel SIG 月度动态:ANCK OOT 驱动基线更新,发布 2 个 ANCK 版本
  • vue3仿飞书头像,根据不同名称生成不同的头像背景色
  • SpringBoot整合三方
  • React之组件的使用
  • 深度学习--长短期记忆网络
  • 研0 冲刺算法竞赛 day29 P2249 【深基13.例1】查找
  • 基于vue框架的CKD电子病历系统nfa2e(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 笔记:python 安装tar包报错
  • 575. 分糖果
  • 手机电量消耗分析工具 Battery Historian 指南
  • 笔试练习day4
  • 公主少爷都爱看的haproxy七层代理详细介绍及常见实验详解
  • Android笔试面试题AI答之Kotlin(6)
  • “tcp控制协议”的理解
  • 考试成绩查询系统,发成绩不再愁
  • 【扒代码】图像数据 Transformer