关于适配器模式这一篇就够了

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许一个接口与另一个不兼容的接口协同工作。在适配器模式中,我们创建一个适配器类,该类将不兼容的接口转换为客户端所期望的接口,从而使客户端能够使用原本不兼容的接口。

概念

适配器模式主要解决的是两个接口之间由于不兼容而不能直接在一起工作的问题。通过引入一个适配器类,该类继承或实现客户端所期望的接口,并在内部持有不兼容接口的对象,将客户端的调用转换为对不兼容接口对象的调用。

优缺点

优点:
  1. 提高复用性:通过适配器,可以将已有的类集成到新的系统中,而无需修改其源代码。
  2. 提高扩展性:在应用程序开发过程中,可以通过添加新的适配器来支持新的接口。
  3. 灵活性高:适配器模式使得接口之间的依赖关系变得灵活,可以通过修改适配器来改变接口的依赖关系。
  4. 符合开闭原则:对扩展开放,对修改关闭。当需要增加新的功能时,只需要增加新的适配器类,而不需要修改已有的代码。
缺点:
  1. 过多适配器会导致系统结构复杂:如果系统中存在过多的适配器,可能会使系统结构变得复杂,难以理解和维护。
  2. 性能损耗:由于适配器需要在客户端和被适配者之间进行转换,因此可能会引入一定的性能损耗。
  3. 滥用适配器模式会导致系统设计紊乱:如果不恰当地使用适配器模式,可能会使系统设计变得混乱,难以理解和维护。

应用场景

  1. 封装有缺陷的接口设计:当外部系统的接口设计存在缺陷时,可以使用适配器模式对接口进行二次封装,抽象出更好的接口设计。
  2. 统一多个类的接口设计:当某个功能的实现依赖于多个外部系统或类时,可以使用适配器模式将这些系统的接口适配为统一的接口定义,以便使用多态的特性来复用代码逻辑。
  3. 替换依赖的外部系统:当需要将项目中依赖的一个外部系统替换为另一个外部系统时,可以使用适配器模式来减少对代码的改动。
  4. 兼容老版本接口:在做版本升级时,对于要废弃的接口,可以使用适配器模式将其暂时保留,并将内部实现逻辑委托给新的接口实现。

代码实现

首先,我们定义客户端所期望的接口(Target):

// 客户端所期望的接口
public interface Target {
void request();
}

然后,我们定义一个已有的类(Adaptee),它的方法并不符合Target接口的要求:

 
// 已有的类,其方法不符合Target接口
public class Adaptee {
public void specificRequest() {
System.out.println("Called specificRequest()");
}
}

接下来,我们创建适配器类(Adapter),它实现了Target接口,并在内部持有一个Adaptee对象。适配器类将request()方法的调用转换为对Adaptee对象的specificRequest()方法的调用:

 
// 适配器类,将Adaptee的方法与Target接口进行适配
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest(); // 调用Adaptee的方法,实现了适配
}
}

最后,我们创建一个客户端类(Client),它使用适配器来与Target接口交互:

// 客户端类,使用适配器与Target接口交互
public class Client {
public static void main(String[] args) {
// 创建Adaptee对象
Adaptee adaptee = new Adaptee();
// 创建适配器对象,并传入Adaptee对象
Target target = new Adapter(adaptee);
// 调用Target接口的方法,实际上会调用Adaptee的specificRequest方法
target.request();
}
}

运行Client类的main方法,你将看到控制台输出:

Called specificRequest()

这表明客户端通过适配器成功调用了Adaptee类的specificRequest()方法,尽管Adaptee类最初并不符合Target接口的要求。这就是适配器模式的一个典型应用,它允许我们将一个类的接口转换为客户端所期望的另一个接口。

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

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

相关文章

保存钉钉群直播回放下载:直播回放下载步骤详解

今天,我们就来拨开云雾,揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了,有需要的自己下载一下 钉钉群直播回放工具下载:https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

ASP.NET Core日志管理(Serilog)

.net 6 web api项目添加日志(Serilog)管理,将日志输出到控制台、文件、数据库 Nuget安装:Serilog.AspNetCore 1、用于日志输出到控制台Serilog.Formatting.Compact 2、用于日志输出到SQLServer数据库Serilog.Sinks.MSSqlServer 3、用于日志输出到文件Serilog.Sinks.RollingF…

pycharm中文件误删或者误操作,怎么恢复

恢复pycharm中文件误删或者误操作 恢复方法:1.xxxx.py文件误删2.xxxx.py文件内操作 在日常学习或练手时总会有一些迷之操作,一些文件被误删或者一些文件越改越糟,想要恢复操作之前的文件。 恢复方法: 1.选则误删文件的上级目录&…

mysql 数据转excel文件

mysql 数据转excel文件 缘由 为售后拉取数据,用navicat太墨迹了,用python写一个main方法跑一下; 1.抽取共同方法,封装成传入mysql,直接下载成excel; 2.写入所有sql语句,传入参数; 代…

Unity ParticleSystem 入门

概述 在项目的制作过程成,一定少不了粒子系统的使用吧,如果你想在项目粒子效果,那这部分的内容一定不要错过喔!我添加了理解和注释更好理解一点! 这次的内容比较多,右侧有目录,可以帮助快速导…

渗透之sql盲注

sql盲注:sql盲注意思是我们并不能在web页面中看到具体的信息,我们只能通过输入的语句的真假来判断。从而拿到我们想要的信息。 我们通常使用ascii值来进行盲注。 目录 手动注入: 脚本注入: 使用sqlmap工具注入: 手…

【面试经典 150 | 分治】排序链表

文章目录 写在前面Tag题目来源解题思路方法一:链表转数组方法二:自顶向下归并排序方法三:自底向上的归并排序 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内…

利用STM32实现语音识别功能

引言 随着物联网和智能设备的普及,语音识别技术正逐渐成为用户交互的主流方式之一。 STM32微控制器具备处理高效率语音识别算法的能力,使其成为实现低成本、低功耗语音交互系统的理想选择。 本教程将介绍如何在STM32平台上开发和部署一个基础的语音识…

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例,文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

【记录】Springboot项目集成docker实现一键部署

公司管理平台完成后,为了方便其他不懂开发的同事部署和测试,集成docker进行一键部署,也为后面自动化部署做准备。本文做个简单记录。 1、安装docker yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/cont…

Ubuntu GUI使用Root用户登录指南

Ubuntu GUI使用Root用户登录指南 一、前言 默认情况下,Ubuntu 禁用了 root 账户,我们必须使用 sudo 命令来执行任何需要 root 权限的任务,比如像这样删除一个系统配置文件(操作危险,请勿尝试):…

是机遇?是未来?拥抱 AI Agent ,拥抱 AI 2.0时代~

✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝…

Devops部署maven项目

这里讲下应用k8s集群devops持续集成部署maven项目的流程。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get curren…

代码随想录-二叉树(节点)

目录 104. 二叉树的最大深度 题目描述: 输入输出描述: 思路和想法: 111. 二叉树的最小深度 题目描述: 输入输出描述: 思路和想法: 222. 完全二叉树的节点个数 题目描述: ​输入输出描…

Flutter笔记:Widgets Easier组件库(3)使用按钮组件

Flutter笔记 Widgets Easier组件库(3):使用按钮组件 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddre…

IDEA 开发找到 java-web 发布到 tomcat 的路径

使用 IDEA 开发 java web 应用,有没有遇到需要找到 tomcat 路径的问题 为什么要找 tomcat 路径呢? 拿我的项目来举例,有统一的线上线下 logback.xml 配置,配置时业务、框架日志输出到 file,少量的启动日志输出到 con…

mysql从入门到起飞+面试基础题

mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…

maven插件:dockerfile-maven-plugin和docker-maven-plugin

Maven插件dockerfile-maven-plugin和docker-maven-plugin都是为Java开发人员提供了一种便捷的方式,通过Maven构建流程来自动化创建、管理和推送Docker镜像。虽然它们有着相似的目标,即集成Docker与Maven项目,但这两个插件在实现细节、功能侧重…

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性) 1. Elasticsearch进阶1.1 核心概念1.1.1 索引Index1.1.1.1 索引创建原则1.1.1.2 Inverted Index 1.1.2 类型Type1.1.3 文档Document1.1.4 字段Field1.1.5 映射Mapping1.…

Agent AI智能体:机器学习与自我优化的奇妙之旅

文章目录 📑前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 📑前言…