当前位置: 首页 > 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PyCharm找不到Python了咋办
  • Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升
  • Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)
  • win系统运行命令行常用命令汇总
  • LVS(Linux Virtual Server)详解
  • 中国健康与养老追踪调查数据库(CHARLS)_2_中文文献整理
  • Codeforces Round 871 (Div. 4)(A~H)
  • 家里浮毛粉尘到处飞?宠物空气净化器出动帮你解决
  • 搜索 ---- 练习题(洛谷)
  • 05:【stm32】重映射AFIO
  • VIVADO IP核之DDS直接数字频率合成器使用详解
  • c#怎么折叠代码快捷
  • el-form-item,label在上方显示,输入框在下方展示
  • Bug太多,苹果手机升级到18.1后怎么降级
  • 状态模式-系统架构师(四十二)
  • angular组件开发
  • canvas绘制圆角头像
  • ERLANG 网工修炼笔记 ---- UDP
  • HTTP那些事
  • JavaScript HTML DOM
  • node入门
  • React的组件模式
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从setTimeout-setInterval看JS线程
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 一个JAVA程序员成长之路分享
  • Python 之网络式编程
  • 国内开源镜像站点
  • 进程与线程(三)——进程/线程间通信
  • ​iOS实时查看App运行日志
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #07【面试问题整理】嵌入式软件工程师
  • #14vue3生成表单并跳转到外部地址的方式
  • (+4)2.2UML建模图
  • (160)时序收敛--->(10)时序收敛十
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C++17) std算法之执行策略 execution
  • (Java)【深基9.例1】选举学生会
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (二十六)Java 数据结构
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三)SvelteKit教程:layout 文件
  • (学习日记)2024.01.09
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)程序员疫苗:代码注入
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core中如何集成RabbitMQ
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET Micro Framework初体验