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

JAVA 设计模式 适配器

适配器设计模式是一种结构型设计模式,其作用是让原本由于接口不兼容而无法一起工作的类能够协同合作。它就像一个 “转换器”,将一个类的接口转换成客户希望的另一个接口。

适配器模式的结构

适配器模式主要包含以下三个角色:
  • 目标接口(Target):客户所期望的接口,目标可以是具体的或抽象的类,也可以是接口。
  • 需要适配的类(Adaptee):包含了现有的接口,但是这个接口和目标接口不兼容。
  • 适配器(Adapter):能够将 Adaptee 的接口转换成 Target 的接口。

适配器模式的实现方式

适配器模式有两种实现方式,分别是类适配器和对象适配器。下面通过 Java 代码来详细说明这两种实现方式。

类适配器(使用继承)

类适配器使用多重继承来适配两个接口。不过在 Java 里,由于不支持多重继承,类适配器只能通过继承一个类并实现另一个接口来达成。
// 目标接口
interface Target {void request();
}// 需要适配的类
class Adaptee {public void specificRequest() {System.out.println("特殊请求");}
}// 类适配器
class ClassAdapter extends Adaptee implements Target {@Overridepublic void request() {// 调用父类的方法specificRequest();}
}// 客户端代码
public class ClassAdapterClient {public static void main(String[] args) {Target target = new ClassAdapter();target.request(); // 输出: 特殊请求}
}

对象适配器(使用组合)

对象适配器通过组合来实现适配器功能,也就是在适配器类中持有需要适配的类的实例。

// 目标接口
interface Target {void request();
}// 需要适配的类
class Adaptee {public void specificRequest() {System.out.println("特殊请求");}
}// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class ObjectAdapterClient {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new ObjectAdapter(adaptee);target.request(); // 输出: 特殊请求}
}

适配器模式的适用场景

适配器模式适用于以下几种情况:
  • 你想要使用一个已经存在的类,但是它的接口和你的需求不相符。
  • 你想创建一个可复用的类,这个类能够和其他不相关的类或者不可预见的类(也就是那些接口不一定兼容的类)协同工作。
  • 你需要使用几个已经存在的子类,但是对每个子类进行适配的话不切实际。在这种情况下,你可以使用对象适配器来适配父类的接口。

适配器模式的优缺点

优点
  • 可以让两个没有关联的类一起运行。
  • 提高了类的复用性。
  • 灵活性和扩展性都非常好,符合开闭原则。
缺点
  • 过多地使用适配器,会让系统变得零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果出现太多这样的情况,会给维护带来困扰。
  • 由于 Java 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
http://www.lryc.cn/news/587824.html

相关文章:

  • 设计模式之适配器模式:让不兼容的接口协同工作的艺术
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十四课——图像二值化的FPGA实现
  • 使用aiohttp实现高并发爬虫
  • 未来手机会自动充电吗
  • vscode 源码编译
  • TCP半关闭
  • 使用layui的前端框架过程中,无法加载css和js怎么办?
  • 如何通过添加企业logo视频水印来对教育视频进行加密?
  • 8:从USB摄像头把声音拿出来--ALSA大佬登场!
  • GNhao,长期使用跨境手机SIM卡成为新趋势!
  • 控制台打开mysql服务报错解决办法
  • 我的Qt八股文面试笔记1:信号与槽文件流操作
  • Sharding-Sphere学习专题(四)广播表和绑定表、分片审计
  • 胡志明证券交易所新一代交易系统解决方案——基于美联储利率决议背景下的越南跨境金融基础设施升
  • 学习C++、QT---25(QT中实现QCombobox库的介绍和用QCombobox设置编码和使用编码的讲解)
  • 2025js——面试题(8)-http
  • 第二章 基于新版Onenet搭建云服务(stm32物联网)
  • 【leetcode】326. 3的幂
  • 对偶原理与蕴含定理
  • SSE(Server-Sent Events)和 MQTT(Message Queuing Telemetry Transport)
  • 【工具】AndroidStudio修改中文语言汉化
  • 【2025/07/14】GitHub 今日热门项目
  • 直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
  • QML 常用控件(二)
  • vue中配置Eslint的步骤
  • Why C# and .NET are still relevant in 2025
  • lightgbm算法学习
  • Python----NLP自然语言处理(中文分词器--jieba分词器)
  • 《大数据技术原理与应用》实验报告一 熟悉常用的Linux操作和Hadoop操作
  • .NET控制台应用程序中防止程序立即退出