Java适配器模式 - 灵活应对不匹配的接口

Java适配器模式 - 灵活应对不匹配的接口

引言:
在软件开发中,我们经常遇到不同系统、库或框架之间的接口不兼容问题。为了解决这些问题,我们可以使用适配器模式。适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行协作,从而使得原本无法一起工作的类能够协同工作。本文将介绍Java中的适配器模式,并通过示例代码展示其用法和优势。

一、适配器模式的定义与分类

适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类能够一起工作。

适配器模式可以分为三种类型:类适配器模式、对象适配器模式和接口适配器模式。在Java中,我们通常使用对象适配器模式和接口适配器模式。

二、对象适配器模式

对象适配器模式通过组合和委托的方式实现接口适配。它使用一个适配器类来实现目标接口,并持有被适配者的引用,从而在调用目标接口方法时,将请求转发给被适配者。

示例代码:

// 目标接口
public interface Target {void request();
}// 被适配者类
public class Adaptee {public void specificRequest() {System.out.println("被适配者的方法");}
}// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

在上面的示例中,Target是目标接口,Adaptee是被适配者类,Adapter是适配器类。适配器类实现了目标接口,并持有被适配者的引用。客户端通过适配器类的实例调用目标接口的方法,实际上是在调用被适配者的方法。

三、接口适配器模式

接口适配器模式(也称为默认适配器模式)适用于一个接口包含多个方法,而我们只想使用其中一部分方法的情况。它通过一个抽象类实现接口,并为接口中的每个方法提供一个默认实现(通常是空实现)。然后,我们可以继承这个抽象类,并只覆盖我们感兴趣的方法。

示例代码:

// 目标接口
public interface Target {void method1();void method2();void method3();
}// 抽象适配器类
public abstract class AbstractAdapter implements Target {@Overridepublic void method1() {// 默认实现(空实现)}@Overridepublic void method2() {// 默认实现(空实现)}@Overridepublic void method3() {// 默认实现(空实现)}
}// 具体适配器类
public class ConcreteAdapter extends AbstractAdapter {@Overridepublic void method1() {System.out.println("覆盖method1()方法");}
}// 客户端代码
public class Client {public static void main(String[] args) {Target target = new ConcreteAdapter();target.method1(); // 输出:覆盖method1()方法target.method2(); // 无输出,使用默认实现target.method3(); // 无输出,使用默认实现}
}

在上面的示例中,Target是目标接口,包含三个方法。AbstractAdapter是抽象适配器类,实现了目标接口,并为每个方法提供了默认实现(空实现)。ConcreteAdapter是具体适配器类,继承自抽象适配器类,并覆盖了method1()方法。客户端通过具体适配器类的实例调用目标接口的方法,只有method1()方法有实际输出,其他方法使用默认实现。

四、适配器模式的优势与应用场景

适配器模式的优势主要体现在以下几个方面:

  1. 灵活性:适配器模式使得原本不兼容的接口能够协同工作,提高了系统的灵活性。
  2. 复用性:通过适配器模式,我们可以复用现有的类,而无需修改其源代码。
  3. 解耦:适配器模式有助于降低类之间的耦合度,使得代码更加清晰、易于维护。

适配器模式适用于以下场景:

  1. 当需要使用现有类,但其接口与我们的需求不匹配时。
  2. 当需要统一多个不同接口时,可以使用适配器模式将它们转换成统一的接口。
  3. 当需要保护现有代码,避免直接修改时,可以通过适配器模式添加新的功能。

五、总结

本文介绍了Java中的适配器模式,包括对象适配器模式和接口适配器模式。适配器模式通过将一个类的接口转换成客户期望的另一个接口,解决了不同接口之间的不兼容问题。它提高了系统的灵活性、复用性和解耦性,使得代码更加清晰、易于维护。在实际开发中,我们可以根据具体需求选择合适的适配器模式来解决接口不匹配的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python采集动态网页Requests就不那么好用了,试试Selenium

Requests + BeautifulSoup + 额外的库: 对于一些简单的动态内容,你能通过分析网络请求来找到并直接获取这些数据。 使用 requests 库来发送 HTTP 请求,并使用 BeautifulSoup 来解析 HTML。 对于 AJAX 请求,你可能需要使用额外的库(如 mitmproxy 或 BrowserMob Proxy)来…

武汉AAA企业信用等级认证

AAA企业信用等级认证 1. 什么是AAA企业信用等级认证 AAA企业信用等级认证是由国家知名的第三方机构对企业的信用状况进行评估和认证的一种方式。它是根据企业在市场经济中所展示出的信用水平、经营实力、企业形象等方面的表现来确定企业的信用等级,以此为企业提供…

在线进制转换工具

在线进制转换 - BTool在线工具软件,为开发者提供方便。 在线进制转换器提供了二进制,八进制,十进制,十六进制等相互转换功能。

Putty中运行matlab文件

首先使用命令 cd /home/ya/CodeTest/Matlab进入路径:到Matlab文件夹下 然后键入matlab,进入matlab环境,如果main.m文件在Matlab文件夹下,直接键入main即可运行该文件。细节代码如下: Unable to use key file "y…

LeetCode 2828.判别首字母缩略词

给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的首字母缩略词。例如,“ab” 可以由 [“apple”, “banana”…

【OpenAI官方课程】第三课:ChatGPT文本总结Summarizing

欢迎来到ChatGPT 开发人员提示工程课程(ChatGPT Prompt Engineering for Developers)!本课程将教您如何通过OpenAI API有效地利用大型语言模型(LLM)来创建强大的应用程序。 本课程由OpenAI 的Isa Fulford和 DeepLearn…

【数据分析——Python Pandas库——数据清洗——电商数据分析】

引言 现如今,我们在电商平台上购物已经成为日常生活的一部分。对于电商公司而言,如何准确理解消费者的需求,提供更好的服务是非常重要的。在这里,数据分析成为提供关键洞察力的工具。Python语言与其数据处理库Pandas,…

K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

hash,以及数据结构——map容器

1.hash是什么? 定义:hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出, 该输出就是散列值。这种转换是一种压缩映射&…

Ubuntu/WSL下生产密钥脚本

说明: 有时候需要为开发人员配发密钥,为方便写了个小脚本,在linux下运行,要求 python10, putty-tools。 使用时,在staffList定义用户列表,运行后程序自动产生对应目录及密钥。 安装: apt inst…

jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水线部分代码如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh执行流水线出现报错&#xff1a;Pseudo-terminal will not be allocated because…

如何把电脑上的png图片变为jpg?图片格式在线转化的方法

由于jpg文件比较小&#xff0c;把png格式转换后更适合我们的保存和使用&#xff0c;尤其是对于一些平台上传来说&#xff0c;很多地方都要求图片格式为jpg&#xff0c;为了能更顺利的上传&#xff0c;本文就叫大家一个图片格式转换的方法&#xff0c;使用压缩图网站&#xff0c…

第2.1章 StarRocks表设计——概述

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的表设计相关内容。 建表是使用StarRocks非常重要的一环&#xff0c;规范化的表设计在某些场景下能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据表类型、数据分布&#xff08;分区分桶及排序键&#…

golang命令行工具gtcli,实现了完美集成与结构化的gin脚手架,gin-restful-api开箱即用

关于gtools golang非常奈斯&#xff0c;gin作为web框架也非常奈斯&#xff0c;但我们在开发过程中&#xff0c;前期搭建会花费大量的时间&#xff0c;且还不尽人意。 为此我集成了gin-restful-api的模板gin-layout&#xff0c;还有脚手架一键生成项目。 集成相关 ginviperz…

【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化

欢迎来到 Android 开发老生常谈的性能优化篇&#xff0c;本文将性能优化划分为内存、网络、布局、卡顿、安装包、启动速度七块&#xff0c;从这七块优化出发&#xff0c;阐述优化的 Application 的方式。 目录 内存优化避免内存泄漏使用内存分析工具优化数据结构和算法数据缓存…

Jmeter基础(1) Mac下载安装启动

目录 Jmeter下载安装启动下载启动 Jmeter下载安装启动 注意⚠️&#xff1a;使用jmeter需要有java环境 下载 官网下载地址&#xff1a;https://jmeter.apache.org/ 会看到这里有两个版本&#xff0c;那么有什么区别么&#xff1f; Binaries是可执行版&#xff0c;直接下载解…

Python算法题集_图论(课程表)

Python算法题集_课程表 题207&#xff1a;课程表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【循环递归全算】2) 改进版一【循环递归缓存】3) 改进版二【循环递归缓存反向计算】4) 改进版三【迭代剥离计数器检测】 4. 最优算法5. 相关资源 本…

Spring整合Junit4和Junit5

1、整合的好处 好处1&#xff1a;不需要自己创建IOC容器对象了好处2&#xff1a;任何需要的bean都可以在测试类中直接享受自动装配 2、操作 整合junit4 ①加入依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><…

代码随想录算法训练营第二十三天补|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

平衡树、二叉树、灵活应用中序遍历&#xff08;值大小有序&#xff09; 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中…

Window部署SkyWalking

SkyWalking mysql的驱动依赖 选择下载版本 v9.4 现在后解压缩目录结构 一、修改config目录文件 application.yml 修改1&#xff1a; selector: ${SW_STORAGE:h2} 修改后&#xff1a; selector: ${SW_STORAGE:mysql} 修改2&#xff1a;使用mysql数据库 mysql: properti…