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

适配器模式(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,一经查实,立即删除!

相关文章

Wpf DataGrid ComboBox 列

遇到的问题 最开始找到的例子要写 Convert, 感觉和 Vue-Elment 的差别比较大后面找到类似与 Vue-Element UI 的写法&#xff0c;开始时数值不更新 关键代码 <DataGridTemplateColumn Header"Digit" Width"100"><DataGridTemplateColumn.CellTem…

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

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

Ubuntu安装Docker和Docker Compose

文章目录 Docker安装Docker Compose安装示例前端Dockerfile示例 Docker官网&#xff1a; https://docs.docker.com/ Docker镜像仓库&#xff1a; https://hub.docker.com/ Docker安装 安装curl(可选) 如果已经安装了curl&#xff0c;则跳过此步骤 # 更新包缓存 sudo apt u…

9、开发基于FemWorkbench的CFD模块

CFD求解器设计针对FreeCAD 背景与动机&#xff1a;SolidWorks不仅提供了FEM功能&#xff0c;还具备CFD功能。为了使FreeCAD拥有类似的功能&#xff0c;考虑在现有的Fem Workbench上添加CFD功能&#xff0c;并重用大部分基础设施。 CFD模拟需求&#xff1a;CFD模拟需要复杂的设…

ubuntu22.04版本操作系统安装docker

安装 Docker 在 Ubuntu 22.04 上与其他 Ubuntu 版本大致相同。以下是在 Ubuntu 22.04 上安装 Docker 的步骤&#xff1a; 1. 更新软件包列表&#xff1a; 确保您的系统已更新到最新的软件包列表。在终端中运行以下命令&#xff1a; sudo apt update2. 安装依赖工具&#xff…

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中文件误删或者误操作 恢复方法&#xff1a;1.xxxx.py文件误删2.xxxx.py文件内操作 在日常学习或练手时总会有一些迷之操作&#xff0c;一些文件被误删或者一些文件越改越糟&#xff0c;想要恢复操作之前的文件。 恢复方法&#xff1a; 1.选则误删文件的上级目录&…

mysql 数据转excel文件

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

Linux内核深入学习 - 内核同步

目录 内核抢占 同步原语 per-CPU变量 API Per CPU 变量的应用 per CPU 变量在多文件下的用法 原子操作 API 优化和内存屏障 自旋锁 自旋锁 API 函数 读写锁 API RCU 信号量 API 1. 信号量的结构&#xff1a; 2. 初始化函数sema_init 3. 可中断获取信号量函数…

Unity ParticleSystem 入门

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

渗透之sql盲注

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

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

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

利用STM32实现语音识别功能

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

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

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

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

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

Ubuntu GUI使用Root用户登录指南

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

安卓手机APP开发__媒体开发部分__立体环绕声

安卓手机APP开发__媒体开发部分__立体环绕声 目录 概述 对于能力的查询 耳机的跟踪 可兼容的内容 声音的属性 禁用立体环绕声的声音 声音的格式 对立体环绕声的修改的监听

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

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

从0到1使用TS实现一个node.js脚手架工具

1.新建一个项目文件夹&#xff0c;然后初始化一下项目文件 npm init -y 2.创建一个src文件夹&#xff0c;里面放index.ts #!/usr/bin/env nodeimport prompts from "prompts"; import path from "node:path"; import fs from "node:fs"; cons…

Devops部署maven项目

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