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

【设计模式-适配】

Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性。

核心思想

适配器模式的核心思想是“将一个类的接口转换成客户期望的另一个接口”,使得两个不兼容的接口能够相互合作。适配器模式可以将现有类的接口与客户端所需的接口进行匹配,达到接口兼容的目的。

组成部分

  • Target(目标接口): 这是客户端期望的接口,通常是你希望进行适配的接口。目标接口可以是一个抽象类或接口。

  • Adaptee(适配者): 这是需要适配的已有接口,可能是一个已经存在的类或接口。适配者类具有客户端需要的功能,但接口与目标接口不兼容。

  • Adapter(适配器): 适配器类实现了目标接口,并持有一个适配者对象的引用。它通过将目标接口的方法委托给适配者对象,实现了接口的转换。

UML图

在这里插入图片描述

Java代码

以下是一个简单的 Java 示例,展示了如何实现适配器模式。假设我们有一个旧版的 OldPrinter 类,它的接口不符合客户端的要求,而客户端需要一个符合 Printer 接口的类。

// Target
interface Printer {void print(String text);
}// Adaptee
class OldPrinter {public void printDocument(String text) {System.out.println("Printing document: " + text);}
}// Adapter
class PrinterAdapter implements Printer {private OldPrinter oldPrinter;public PrinterAdapter(OldPrinter oldPrinter) {this.oldPrinter = oldPrinter;}@Overridepublic void print(String text) {oldPrinter.printDocument(text);}
}// Client
public class AdapterPatternExample {public static void main(String[] args) {OldPrinter oldPrinter = new OldPrinter();Printer printer = new PrinterAdapter(oldPrinter);// Client uses Printer interfaceprinter.print("Hello, Adapter Pattern!");}
}

解释

  • Target(Printer): 这是客户端所期望的接口,它定义了 print 方法。

  • Adaptee(OldPrinter): 这是现有的接口,它定义了 printDocument 方法,这个方法的接口与 Printer 不兼容。

  • Adapter(PrinterAdapter): 适配器类实现了 Printer 接口,并持有一个 OldPrinter 对象。适配器的 print 方法将调用 OldPrinter 的 printDocument 方法,从而实现了接口的适配。

优点

  • 兼容性: 使得原本不兼容的接口可以协同工作,扩展了类的功能。

  • 提高复用性: 适配器模式可以将现有的类与新的接口结合,复用现有的类功能而不需要修改它们。

  • 简化客户端代码: 客户端代码只需要依赖目标接口,而不需要关心适配者的细节。

缺点

  • 增加复杂性: 适配器模式可能会引入额外的适配器类,使得系统的复杂性增加。

  • 性能开销: 由于适配器需要做额外的接口转换,可能会有一定的性能开销。

使用场景

  • 旧系统与新系统的集成: 当你需要将一个旧系统与一个新系统进行集成,但它们的接口不兼容时,适配器模式可以帮助你实现这一点。

  • 第三方库的集成: 在使用第三方库时,库的接口可能与应用的需求不一致,适配器模式可以用来解决接口不匹配的问题。

  • 接口转换: 需要将接口从一种形式转换为另一种形式时,比如在不同的模块之间进行通信。

实现方式

  • 类适配器: 通过继承方式实现适配器模式。这种方式需要利用多重继承(在 Java 中通过组合实现),适配器类继承了适配者,并实现了目标接口。

  • 对象适配器: 通过组合方式实现适配器模式。适配器类持有一个适配者对象的引用,并实现目标接口,适配器类将目标接口的请求委托给适配者对象处理。

总结

适配器模式通过引入适配器,将不兼容的接口转换为客户端所期望的接口,从而实现接口的兼容性。这种模式可以使系统更加灵活,减少系统的耦合,提高复用性。适配器模式特别适用于集成不兼容的接口或者引入已有的类库时。

相关文章:

【设计模式-适配】

Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性…...

深度学习02-pytorch-08-自动微分模块

​​​​​​​ 其实自动微分模块,就是求相当于机器学习中的线性回归损失函数的导数。就是求梯度。 反向传播的目的: 更新参数, 所以会使用到自动微分模块。 神经网络传输的数据都是 float32 类型。 案例1: 代码功能概述: 该…...

使用Python实现深度学习模型:智能宠物监控与管理

在现代家庭中,宠物已经成为许多家庭的重要成员。为了更好地照顾宠物,智能宠物监控与管理系统应运而生。本文将详细介绍如何使用Python实现一个智能宠物监控与管理系统,并结合深度学习模型来提升其功能。 一、准备工作 在开始之前,我们需要准备以下工具和材料: Python环境…...

【HTTPS】对称加密和非对称加密

HTTPS 是什么 HTTPS 是在 HTTP 的基础上,引入了一个加密层(SSL)。HTTP 是明文传输的(不安全) 当下所见到的大部分网站都是 HTTPS 的,这都是拜“运营商劫持”所赐 运营商劫持 下载⼀个“天天动听“&…...

MySQL中的LIMIT与ORDER BY关键字详解

前言 众所周知,LIMIT和ORDER BY在数据库中,是两个非常关键并且经常一起使用的SQL语句部分,它们在数据处理和分页展示方面发挥着重要作用。 今天就结合工作中遇到的实际问题,回顾一下这块的知识点。同时希望这篇文章可以帮助到正…...

Java 编码系列:集合框架(List、Set、Map 及其常用实现类)

引言 在 Java 开发中,集合框架是不可或缺的一部分,它提供了存储和操作一组对象的工具。Java 集合框架主要包括 List、Set 和 Map 接口及其常用的实现类。正确理解和使用这些集合类不仅可以提高代码的可读性和性能,还能避免一些常见的错误。本…...

Go进阶概览 -【7.2 泛型的使用与实现分析】

7.2 泛型的使用与实现分析 泛型是Go 1.18引入的概念,在引入这个概念前经过了好几年的考量最终才将这这个特性加进去。 泛型在多种语言中都是存在的,比如C、Java等语言中都有泛型的概念。 本节我们将针对泛型的使用、实现原理进行整体的讲解。 本节代…...

罗德岛战记游戏源码(客户端+服务端+数据库+全套源码)游戏大小9.41G

罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 下载地址: 通过网盘分享的文件:【源码】罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 链接: https://pan.baidu.com/s/1y0…...

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实,提供互动性强的学习体验,正在改变传统教育模式。AI不仅改变了传统的教学模式,还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务,AI正在全方位提升教育质量和效率。随着…...

WebServer

一、服务器代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #define PORT 80 #define BUFFER_SIZE 1024 void ha…...

java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码

项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能&#xff1a; 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息&#xff0c;知识分类&#xff0c;知识信息等&#xff0c;用户可以查看和下载管理员发布…...

go的结构体、方法、接口

结构体&#xff1a; 结构体&#xff1a;不同类型数据集合 结构体成员是由一系列的成员变量构成&#xff0c;这些成员变量也被称为“字段” 先声明一下我们的结构体&#xff1a; type Person struct {name stringage intsex string } 定义结构体法1&#xff1a; var p1 P…...

力扣第一题——删除有序数组中的重复项

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次&#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1)额外空间的条件下完成。 示例 1&#x…...

Tuxera NTFS for Mac 2023绿色版

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...

LeetCode[中等] 155. 最小栈

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…...

Python青少年简明教程目录

Python青少年简明教程目录 学习编程语言时&#xff0c;会遇到“开头难”和“深入难”的问题&#xff0c;这是许多编程学习者都会经历的普遍现象。 学习Python对于青少年来说是一个很好的编程起点&#xff0c;相对容易上手入门&#xff0c;但语言特性复杂&#xff0c;应用较广&…...

Revit学习记录-版本2018【持续补充】

将墙面拆分并使用不同材料 【修改】>【几何图形】>【拆分面】(SF)&#xff0c; 然后再使用【修改】>【几何图形】>【填色】&#xff08;PT&#xff09;进行填充 楼板漏在墙外 绘制楼板时最好选择墙体绘制&#xff0c;如果标高上不显示墙体&#xff0c;可以先选…...

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径&#xff0c;而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点&#xff1a; 1. 自动提取特征&#xff1a;与传统的机器学习方法不同&#xff0c;深度学习不需要手动…...

leetcode232. 用栈实现队列

leetcode232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元…...

智慧火灾应急救援航拍检测数据集(无人机视角)

智慧火灾应急救援。 无人机&#xff0c;直升机等航拍视角下火灾应急救援检测数据集&#xff0c;数据分别标注了火&#xff0c;人&#xff0c;车辆这三个要素内容&#xff0c;29810张高清航拍影像&#xff0c;共31GB&#xff0c;适合森林防火&#xff0c;应急救援等方向的学术研…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...