1.适配器模式
概述
适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。
适配器模式在业务场景中非常有用,尤其是在系统集成、接口兼容性处理以及代码复用等场景。以下是一个实际的业务场景示例:
业务场景:支付系统集成
假设你正在开发一个电商平台,需要集成多个第三方支付网关(如支付宝、微信支付、银联支付等)。每个支付网关的接口设计不同,但你的系统希望统一调用一个支付接口来处理所有支付请求。
1. 目标接口(统一的支付接口)
public interface PaymentGateway {void pay(double amount); }
2. 需要适配的第三方支付类
支付宝支付
public class Alipay {public void alipayPayment(double amount) {System.out.println("支付宝支付:支付金额 " + amount);} }
微信支付
public class WechatPay {public void wechatPayment(double amount) {System.out.println("微信支付:支付金额 " + amount);} }
3. 适配器类
支付宝适配器
public class AlipayAdapter implements PaymentGateway {private Alipay alipay;public AlipayAdapter(Alipay alipay) {this.alipay = alipay;}@Overridepublic void pay(double amount) {alipay.alipayPayment(amount); // 调用支付宝的支付方法} }
微信支付适配器
public class WechatPayAdapter implements PaymentGateway {private WechatPay wechatPay;public WechatPayAdapter(WechatPay wechatPay) {this.wechatPay = wechatPay;}@Overridepublic void pay(double amount) {wechatPay.wechatPayment(amount); // 调用微信支付的支付方法} }
4. 客户端代码
public class PaymentSystem {public static void main(String[] args) {// 创建支付宝适配器PaymentGateway alipayGateway = new AlipayAdapter(new Alipay());alipayGateway.pay(100.0); // 调用统一的支付接口// 创建微信支付适配器PaymentGateway wechatGateway = new WechatPayAdapter(new WechatPay());wechatGateway.pay(200.0); // 调用统一的支付接口} }
5. 输出
复制
支付宝支付:支付金额 100.0 微信支付:支付金额 200.0
业务场景总结
-
问题:第三方支付接口设计不一致,导致系统无法统一调用。
-
解决方案:使用适配器模式,为每个第三方支付接口创建一个适配器,将它们的接口转换为统一的
PaymentGateway
接口。 -
优点:
-
系统与第三方支付接口解耦,便于扩展新的支付方式。
-
客户端代码只需调用统一的
PaymentGateway
接口,无需关心具体支付实现。 -
符合开闭原则,新增支付方式时只需增加适配器,无需修改现有代码。
-
其他业务场景
-
日志系统集成:将不同日志框架(如 Log4j、SLF4J)适配到统一的日志接口。
-
数据格式转换:将不同数据格式(如 XML、JSON)转换为系统需要的格式。
-
旧系统升级:在新系统中复用旧系统的功能,通过适配器兼容旧接口。
适配器模式的核心思想是兼容性,它帮助我们在不修改现有代码的情况下,实现不同接口的协同工作。
相关文章:
1.适配器模式
概述 适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。 适配器模式在业务场景中非常有用,尤其是在系统集成、接口兼容性处理以及代码复用等场景。以下是一个实际的业务场景示例: 业务场景…...
选择排序(详解)c++
选择排序(Selection Sort)是⼀种特别直观的排序算法。每次找出未排序序列中最⼩的元素,然后放进有序序列的后⾯ 算法思想: 每次找出未排序序列中最小的元素,然后放进有序序列的后面 在数组中完成选择排序 落实到代码的时候就两步:找最小交换 …...
[java基础-JVM篇]1_JVM自动内存管理
JVM内存管理涉及但不限于类加载、对象分配、垃圾回收等,本篇主要记录运行时数据区域与对象相关内容。 内容主要来源《深入理解Java虚拟机:JVM高级特性与最佳实践》与官方文档,理解与表述错漏之处恳请各位大佬指正。 目录 运行时数据区域 栈 栈…...
python-leetcode 42.验证二叉搜索树
题目: 给定二叉树的根节点root,判断是否是一个有效二叉搜索树 有效二叉搜索树: 1.节点的左子树只包含小于当前节点的树 2.节点的右子树只包含大于当前节点的树 3.所有左子树和右子树自身必须也是二叉搜索树 方法一:递归 如果该二叉树的…...
Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3ÿ…...
【Bluedroid】AVRCP 连接源码分析(三)
接着上一篇【Bluedroid】AVRCP 连接源码分析(一)-CSDN博客,继续AVRCP连接的源码分析。 AVRC_OpenBrowse /packages/modules/Bluetooth/system/stack/avrc/avrc_api.cc /******************************************************************************** Function …...
图数据库Neo4j面试内容整理-约束(Constraint)
约束(Constraint) 是数据库中用于确保数据一致性和完整性的一种机制。它限制了数据的某些方面,确保特定条件得到满足。在 Neo4j 中,约束主要用于确保图数据的一致性,防止插入不符合规则的数据。约束通常与索引一起使用,但它们的功能和目的有所不同。 1. Neo4j 中的约束类…...
QUdpSocket的readyRead信号只触发一次
问题 QUdpSocket的readyRead信号只触发一次。 原因 on_readyRead槽函数里必须读出现有数据后,才能触发新的事件。 解决办法 在on_readyRead槽函数里取出数据。 void MainWindow::on_readyRead() {qDebug() << "on_readyRead in";while (m_udp…...
使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享
目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …...
深度解析:大模型在多显卡服务器下的通信机制与分布式训练——以DeepSeek、Ollama和vLLM为例
一、引言:大模型与多显卡的必然结合 随着大模型参数规模突破千亿级(如GPT-4、DeepSeek),单显卡的显存容量与算力已无法满足需求。多显卡并行计算成为训练与推理的核心技术,其核心挑战在于高效通信与负载均衡。本文以国…...
爬虫基础入门之爬取豆瓣电影Top250-Re正则的使用
网址:豆瓣电影 Top 250 本案例所需要的模块 requests (用于发送HTTP请求)re (用于字符串匹配和操作) 确定需要爬取的数据 : 电影的名称电影的年份电影的评分电影评论人数 一. 发送请求 模拟浏览器向服务器发送请求 准备工作 -分析页面: F12 or 右击点击检查 查看…...
【R安装包报错】在conda环境下用R语言命令安装R包报错
报错如下: gnu/include/c/11.2.0/ctime:80:11: error: ‘timespec_get’ has not been declared in ‘::’ 80 | using ::timespec_get; | ^~~~~~~~~~~~ 修改 报错原因:如果使用的是conda安装的g,可能与系统库不兼容。尝试 切换到系统默认编…...
基于STM32单片机设计的宠物喂食监控系统
1. 项目开发背景 随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能…...
Minio分布式多节点多驱动器集群部署
Minio分布式多节点多驱动器集群部署 Minio分布式多节点多驱动器集群部署节点规划先决条件开放防火墙端口设置主机名更新域名映射文件时间同步存储要求内存要求 增加虚拟机磁盘(所有机器都要执行)部署分布式 MinIO测试上传与预览测试高可用MinIO 配置限制模拟单节点磁盘故障模拟…...
Web前端开发——HTML基础
本系列博客声明,根据本人所学书籍和网上的一些资料共同磨合,写下web前端系列的博客 HTML基础 一、HTML基本概述[^1]二、HTML大体认知1.HTML基本结构2.HTML 语法格式 三、THML常用标记[^2]1.文本标记(1)标题(2…...
《计算机视觉》——图像拼接
图像拼接 图像拼接是将多幅有重叠区域的图像合并成一幅全景或更大视角图像的技术,以下为你详细介绍: 原理:图像拼接的核心原理是基于图像之间的特征匹配。首先,从每幅图像中提取独特的特征点,如角点、边缘点等&#x…...
zookeeper从入门到精通
一、入门基础 1.1 什么是 ZooKeeper ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,后成为 Apache 的顶级项目。它为分布式应用提供了高效、可靠的协调服务,例如统一命名服务、配置管理、分布式锁、集群管理等。ZooKeeper 的数据模型类…...
2.2 添加注释
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 注释是为了方便理解代码含义而添加的简短的解释性说明。在编译时,编辑器不会将注释加入最终生成的文件中,不…...
具有快慢思考的语言调节机器人操作
24年1月来自华东师范大学、美的集团和上海大学的论文“Language-Conditioned Robotic Manipulation with Fast and Slow Thinking”。 语言调节机器人操作,旨在将自然语言指令转化为可执行动作,从简单的“拾取和放置”到需要意图识别和视觉推理的任务。…...
美颜相机1.0
项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...
Css3重点知识讲解
选择器 优先级: id 选择器 > 类选择器 > 标签选择器 类选择器: .myClass {color: blue; }id 选择器(全局唯一): #myId {color: green; }标签选择器: p {color: red; }层次选择器: /…...
[Web 安全] Web 安全攻防 - 学习手册
关联专栏:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Web 安全攻防 —— 信息收集篇 Web 信息收集 — 手动收集域名信息 Web 信息收集 — 手动收集 IP 信息 Web 信息收集 — 端口服务信息收集 Web 信息收集 — 自动化信息收集 — ShuiZe 水泽 We…...
nextjs的记录一些小东西
1. 格式化时间:使用date-fns库 npm install date-fns 在组建中创建date.js import { parseISO, format } from date-fnsexport default function Date({ dateString }) {const date parseISO(dateString)return <time dateTime{dateString}>{format(date,…...
故障诊断 | PID搜索算法优化CatBoost故障诊断(MatlabPython)
目录 效果一览文章概述故障诊断 | PID搜索算法优化CatBoost故障诊断(Matlab&Python)PID搜索算法优化CatBoost故障诊断PID搜索算法优化CatBoost故障诊断一、引言1.1、研究背景与意义1.2、研究现状1.3、研究目的与内容二、CatBoost算法概述2.1、CatBoost算法原理2.2、CatBo…...
探索关键领域的AI工具:机器学习、深度学习、计算机视觉与自然语言处理
引言 在人工智能(AI)迅猛发展的今天,机器学习(ML)、深度学习(DL)、计算机视觉(CV)和自然语言处理(NLP)已经成为解决复杂问题的关键技术。无论是自动驾驶车辆的视觉识别,还是智能助手的对话理解,这些技术都在改变着世界。本文将介绍在各个领域…...
使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流
在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…...
11、集合框架
一、简介 Java集合框架位于java.util包中 Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不…...
从入门到精通Rust:资源库整理
今天给大家分享一些优质的Rust语言学习资源,适合不同水平的学习者。前三个官方资源是我Rust语言的启蒙老师,非常平易近人。 官方资源 The Rust Programming Language (The Book) 链接: https://doc.rust-lang.org/book/ 简介: 官方权威指南,…...
Spring Boot 项目启动命令大全:参数详解与高阶用法
Spring Boot 项目启动命令大全:参数详解与高阶用法 一、基础启动命令 默认启动命令 java -jar xxx.jar适用场景:开发环境快速启动,使用默认配置(端口 8080,内存由 JVM 自动分配)。 指定 JVM 内存参数 java…...
c++day4
作业 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class S{ private:int a;int b; public:S(i…...
应对LLM应用中的AI幻觉,如何通过Token对数概率预测LLM的可靠性
应对LLM应用中的AI幻觉 如何通过Token对数概率预测LLM的可靠性 内容: 1. 相关机器学习(ML)概念回顾(精准度/召回率,LLM直觉) 2. 使用序列对数概率度量作为LLM信心 3. 通过案例研究结果过滤低质量LLM输出…...
Openwrt路由器操作系统
一、什么是 OpenWrt? OpenWrt 是一个基于 Linux 的开源操作系统,主要设计用于嵌入式设备,尤其是路由器。与其说是传统的路由器固件,不如说它是一个路由器操作系统。 传统的路由器固件通常由路由器厂商开发,功能相对固…...
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…...
Ansible 学习笔记
这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的,默认使用22端口, 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法...
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
【CSS】HTML元素布局基础总结
HTML默认布局和元素显示 CSS 元素显示 { HTML 默认布局: 流式布局 { 从左到右,从上到下 随页面宽度变化动态排列元素 文档流:整个 H T M L 文档的流式布局 HTML 元素分为 { 块级元素 :默认占满一行 行内元素 :在行内最…...
【JavaScript】什么是JavaScript?以及常见的概念
作为 JavaScript 初学者,想要更好地理解这门语言,需要从核心概念、实践练习和项目实战三个方面入手。下面是详细的学习路线和方法,帮助你系统性地掌握 JavaScript。 一、理解 JavaScript 的核心概念 JavaScript 是一门动态、弱类型的编程语言…...
为什么要将PDF转换为CSV?CSV是Excel吗?
在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…...
P1038 [NOIP 2003 提高组] 神经网络
题目描述 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元(编号为 i) 图中,X1∼X3 是信息…...
TypeScript 类型断言的适用场景及代码示例
类型断言的适用场景及代码示例 适用场景 类型断言就像是你很确定某个东西是什么,然后直接告诉 TypeScript 编译器“相信我,它就是这个类型”。以下是几种常见的适用场景: 从 any 类型恢复具体类型:当你使用 any 类型时…...
Docker 容器
Docker 是一种开源的容器化平台,可以让开发人员将应用程序及其依赖项打包到一个可移植的容器中,然后部署到任何支持 Docker 的环境中。Docker 的基本概念包括以下几点: 1. **容器(Container)**:容器是一个独立、轻量级的运行环境…...
Spark(3)vi的基本使用
一.打开与创建文件 二.三种模式 三. 光标操作 四.复制粘贴 一.打开与创建文件 它是linux的内置命令,所以还是以命令的方式来运行。 命令的格式是:Vi /路径/文件名。要注意如下两种情况: 1.如果这个文件不存在,此时就是新建文…...
element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...
Starlink卫星动力学系统仿真建模第九讲-滑模(SMC)控制算法原理简介及卫星控制应用
滑模控制(Sliding Mode Control)算法详解 一、基本原理 滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内…...
《深度剖析Linux 系统 Shell 核心用法与原理_666》
1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件,并通过grep查找包含特定字符串的文件…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
超详细介绍map(multimap)的使用
map类的介绍 map的声明如下,Key是map底层关键字的类型,T是map底层value的类型。set默认要求Key支持小于比较,如果不支持或者需要的情况下我们可以自行传入仿函数,map底层存储数据的内存是从空间申请来的。一般情况下,我…...
原生稀疏注意力NSA 替换transformer 注意力进行文本生成训练
DeepSeek-R1这篇文章,聚焦范围更加小,R1的重点在于提出了一个文本生成的训练策略和蒸馏策略,这篇文章则是提出了一个注意力机制NSA,主要解决的是长序列做注意力时带来的效率问题。通篇文章看下来,它的实际意义可能比较…...
读书笔记:《百年孤独》
《百年孤独》加西亚.马尔克斯 著 范晔 译 读出了阅读障碍。 记不得书中的人,记不得书中的事,更不知何为孤独,只记得马孔多,这个陌生的地方,还有那个猪尾巴婴儿。 百年:故事跨越了百年 孤独&#…...
TVS管学习记录
文章目录 前言一、TVS是什么?二、TVS关键参数1.反向截至电压**实际意义** 2.钳位电压**定义与作用****选择依据** **4. 实际应用示例****场景:通信端口的ESD保护** 3.反向截至电压和钳位电压的关联和区别**. 小结** 三、实际应用电路举例总结 前言 TVS管…...