当前位置: 首页 > 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.dtcms.com/a/278580.html

相关文章:

  • 八、nginx搭建,实现vue跳转nginx跳转gateway
  • Java设计模式(java design patterns)
  • 概率论与数理统计(二)
  • Maven+Spring
  • 在Maven多模块项目中进行跨模块的SpringBoot单元测试
  • 【橘子分布式】Thrift RPC(理论篇)
  • vscode 安装 esp ide环境
  • LeetCode-283. 移动零(Java)
  • 【STM32】什么在使能寄存器或外设之前必须先打开时钟?
  • Pandas-特征工程详解
  • 零基础入门Java虚拟机与单例模式:新手友好教程
  • Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(二)
  • VSCODE 选中多行 需要同时按住alt键才可以
  • ShenYu实战、问题记录
  • 记字节前端面试一道简单的算法题
  • 注解@Autowired和@Resource的区别
  • CentOS7 OpenSSL升级1.1.1t;OpenSSH 升级 9.8p1 保姆级教程
  • jenkins 流水线比较简单直观的
  • 《每日AI-人工智能-编程日报》--2025年7月14日
  • Spring Boot - Spring Boot 集成 MyBatis 分页实现 PageHelper
  • 17.Python 中的相等性比较:== vs is
  • 具身智能零碎知识点(五):VAE中对使用KL散度的理解
  • 【Java EE初阶 --- 网络原理】初识网络
  • flink 和 spark 架构的对比
  • 如何在 Java 中使用 Redis 实现缓存优化?
  • 4G模块 A7670发送英文短信到手机
  • 11.设置 Python 3 和 pip 3 为默认版本
  • Google的Mediapipe开源框架介绍及使用说明
  • 基于浅切多道的晶圆切割 TTV 均匀性控制与应力释放技术
  • python学智能算法(十八)|SVM基础概念-向量点积