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

适配器模式详解和实现(设计模式 四)

适配器模式将一个类的接口转换成客户端所期望的另一个接口,解决由于接口不兼容而无法进行合作的问题。

设计基本步骤

1. 创建目标接口(Target Interface),该接口定义了客户端所期望的方法。

2.创建被适配类(Adaptee Class),该类是需要被适配的类,它包含了一些已经存在的方法。

3. 创建适配器类(Adapter Class),该类实现了目标接口,并包含被适配对象的引用。

4. 在适配器类中实现目标接口的方法,并在方法内部调用被适配类的方法。

实例介绍运用

假设我们正在开发一个电子支付业务,该系统需要与不同的支付服务提供商进行集成(支付宝、微信支付和银联支付),每个支付服务提供商都有自己的接口和方法来处理支付请求,我们希望将支付服务提供商的接口适配成了统一的支付接口(转换),我们可以使用适配器模式实现,这样三种支付方式我们都能同时处理。

1. 创建目标接口

public interface PaymentService {void pay(String paymentType, double amount);
}

2.创建被适配类

public class AlipayService implements PaymentService {//支付宝支付@Overridepublic void pay(String paymentType, double amount) {System.out.println("Alipay payment: " + amount + " CNY");}
}public class WechatPayService implements PaymentService {//微信支付@Overridepublic void pay(String paymentType, double amount) {System.out.println("WeChat payment: " + amount + " CNY");}
}public class UnionPayService implements PaymentService {//银联支付@Overridepublic void pay(String paymentType, double amount) {System.out.println("UnionPay payment: " + amount + " CNY");}
}

3. 创建适配器类、实现方法

public class PaymentAdapter implements PaymentService {//被适配对象引用private AlipayService alipayService;private WechatPayService wechatPayService;private UnionPayService unionPayService;//初始化public PaymentAdapter() {alipayService = new AlipayService();wechatPayService = new WechatPayService();unionPayService = new UnionPayService();}@Overridepublic void pay(String paymentType, double amount) {//实现统一支付逻辑if (paymentType.equalsIgnoreCase("Alipay")) {alipayService.pay(paymentType, amount);} else if (paymentType.equalsIgnoreCase("WeChatPay")) {wechatPayService.pay(paymentType, amount);} else if (paymentType.equalsIgnoreCase("UnionPay")) {unionPayService.pay(paymentType, amount);} else {//其他方式不支持System.out.println("Unsupported payment type: " + paymentType);}}
}

4.客户端简单实现

public class Main {public static void main(String[] args) {PaymentService paymentService = new PaymentAdapter();paymentService.pay("Alipay", 10000.0);paymentService.pay("WeChatPay", 20000.0);paymentService.pay("UnionPay", 30000.0);paymentService.pay("ApplePay", 500.0);}
}

相关文章:

适配器模式详解和实现(设计模式 四)

适配器模式将一个类的接口转换成客户端所期望的另一个接口,解决由于接口不兼容而无法进行合作的问题。 设计基本步骤 1. 创建目标接口(Target Interface),该接口定义了客户端所期望的方法。 2.创建被适配类(Adaptee…...

IDEA的使用

文章目录 1.IDEA配置1.1 idea界面说明1.2 git1.3 JDK1.4 maven1.5 Tomcat1.6 idea设置编码格式1.7 vscodenodejs1.8 windows下安装redis 2. IDEA问题2.1 setAttribute方法爆红2.2 idea cannot download sources解决办法2.3 springboot项目跑起来不停run 3. vscode3.1 vscode显示…...

CSS详细基础(二)文本样式

插播一条CSS的工作原理: CSS是一种定义样式结构如字体、颜色、位置等的语言,被用于描述网页上的信息格式化和显示的方式。CSS样式可以直接存储于HTML网页或者单独的样式单文件。无论哪一种方式,样式单包含将样式应用到指定类型的元素的规则。…...

win10系统任务栏图标变成白色的解决办法

我平时都是用滴答清单进行管理这个自己的日程代办的,但是今天打开的时候发现这个快捷方式突然变成纯白色的了,重启电脑之后,这个图标的样式仍然没有变化。上网查找解决办法之后,终于搞好了,于是就有了下面的教程。 为什…...

hadoop生态现状、介绍、部署

一、引出hadoop 1、hadoop的高薪现状 各招聘平台都有许多hadoop高薪职位,可以看看职位所需求的技能 ----> hadoop是什么,为什么会这么高薪?引出大数据,大数据时代,大数据与云计算 2、大数据时代的介绍 大数据的故事…...

二、EFCore 数据库表的创建和迁移

文章目录 一、数据库连接二、数据库表迁移一、数据库连接 在NuGet上安装EntityFramework 代码如下: Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.Extensions.Configuration.Json配置数据连接 appsettings.json 增加数据库连接配置 &quo…...

在nodejs中使用typescript

在nodejs中使用typescript 如果我们正在使用nodejs来开发应用,那么对于管理和扩展一个大型代码库来说是一个非常大的挑战。克服这一问题的方法之一是使用typescript,为js添加可选的类型注释和高级功能。在本文中,我们将探讨如何使用在nodejs中使用types…...

数据结构与算法基础(青岛大学-王卓)(8)

哎呀呀,sorry艾瑞波地,这次真的断更一个月了,又发生了很多很多事情,秋风开始瑟瑟了,老父亲身体查出肿瘤了,有病请及时就医,愿每一个人都有一个健康的身体,God bless U and FAMILY. 直…...

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…...

CSS基础语法第二天

目录 一、复合选择器 1.1 后代选择器 1.2 子代选择器 1.3 并集选择器 1.4 交集选择器 1.4.1超链接伪类 二、CSS特性 2.1 继承性 2.2 层叠性 2.3 优先级 基础选择器 复合选择器-叠加 三、Emmet 写法 3.1HTML标签 3.2CSS 四、背景属性 4.1 背景图 4.2 平铺方式 …...

ThreeJS - 封装一个GLB模型展示组件(TypeScript)

一、引言 最近基于Three.JS,使用class封装了一个GLB模型展示,支持TypeScript、支持不同框架使用,具有多种功能。 (下图展示一些基础的功能,可以自行扩展,比如光源等) 二、主要代码 本模块依赖…...

HashMap面试题

1.hashMap底层实现 hashMap的实现我们是要分jdk 1.7及以下版本,jdk1.8及以上版本 jdk 1.7 实现是用数组链表 jdk1.8 实现是用数组链表红黑树, 链表长度大于8(TREEIFY_THRESHOLD)时,会把链表转换为红黑树&#xff0c…...

Java编程技巧:swagger2、knif4j集成SpringBoot或者SpringCloud项目

目录 1、springbootswagger2knif4j2、springbootswagger3knif4j3、springcloudswagger2knif4j 1、springbootswagger2knif4j 2、springbootswagger3knif4j 3、springcloudswagger2knif4j 注意点: Api注解:Controller类上的Api注解需要添加tags属性&a…...

第三章:最新版零基础学习 PYTHON 教程(第九节 - Python 运算符—Python 中的除法运算符)

除法运算符允许您将两个数字相除并返回商,即,第一个数字或左侧的数字除以第二个数字或右侧的数字并返回商。 Python 中的除法运算符 除法运算符有两种类型: 浮点数除法整数除法(向下取整除法)整数相除时,结果四舍五入为最接近的整数,并用符号“//”表示。浮点数“/”…...

【python】导出mysql数据,输出excel!

参考https://blog.csdn.net/pengneng123/article/details/131111713 import pymysql import pandas as pd #import openpyxl import xlsxwriterdb pymysql.connect(host"10.41.241.114", port***,user***,password***,charsetutf8mb4 )cursor db.cursor() #创建游…...

【Java 进阶篇】JDBC ResultSet 遍历结果集详解

在Java数据库编程中,经常需要执行SQL查询并处理查询结果。ResultSet(结果集)是Java JDBC中用于表示查询结果的关键类之一。通过遍历ResultSet,我们可以访问和操作从数据库中检索的数据。本文将详细介绍如何使用JDBC来遍历ResultSe…...

华为数通方向HCIP-DataCom H12-831题库(单选题:161-180)

第161题 某台路由器Router LSA如图所示,下列说法中错误的是? A、本路由器已建立邻接关系 B、本路由器为DR C、本路由支持外部路由引入 D、本路由器的Router ID为10.0.12.1 答案: B 解析: 一类LSA的在transnet网络中link id值为DR的route id ,但Link id的地址不是10.0.12.…...

【VsCode】SSH远程连接Linux服务器开发,搭配cpolar内网穿透实现公网访问

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...

java并发编程 守护线程 用户线程 main

经常使用线程,没有对守护线程和用户线程的区别做彻底了解 下面写4个例子来验证一下 源码如下 /* Whether or not the thread is a daemon thread. */ private boolean daemon false;/*** Marks this thread as either a {linkplain #isDaemon daemon} thread*…...

wxWidgets(1):在Ubuntu 环境中搭建wxWidgets 库环境,安装库和CodeBlocks的IDE,可以运行demo界面了,继续学习中

1,选择使用 wxWidgets 框架 选择这个主要是因为完全的开源,不想折腾 Qt的库,而且打包的文件比较大。 网络上面有很多的对比,而且使用QT的人比较多。 但是我觉得wxwidgets 更加偏向 c 语法本身,也有助学习C。 没有太多…...

OpenClaw 消息路由与广播机制深度解析

OpenClaw 消息路由与广播机制深度解析 作者: Social Agent (小社) 日期: 2026-03-18 研究模块: channels/channel-routing + broadcast-groups + group-messages 一、消息路由的核心设计 1.1 确定性路由,而非 AI 决策 OpenClaw 消息路由最重要的设计决策是:路由是确定性的…...

半导体产业3000亿美元背后的冷思考:成本高墙、利润悖论与创新挑战

1. 行业现状:跨越3000亿美元门槛后的冷思考 又到了一年一度回顾过去、展望未来的时刻。对于我们这些在半导体行业摸爬滚打了十几年甚至几十年的老工程师来说,每年的这个时候心情总是复杂的。今年有个标志性的消息:全球半导体产业营收终于再次…...

掌握高效窗口管理:专业级分辨率调整工具完全指南

掌握高效窗口管理:专业级分辨率调整工具完全指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 在当今多任务处理和多屏工作环境中,你是否经常遇到窗口大小不合适、分辨率限制或游戏画面…...

跨境直播里,为什么很多团队设备很强,画面却依旧不稳定?

做跨境直播的人,基本都会经历一个阶段:疯狂升级设备。更贵的相机更强的显卡更高规格的采集卡更多灯光但实际开播后:直播依旧掉帧OBS 占用异常推流延迟增加画面偶发模糊音视频不同步很多时候,问题并不是设备性能不够。而是&#xf…...

效率翻倍!用 ModelSim 2019.2 给 Vivado 2020.2 工程做仿真的几个高级技巧

效率翻倍!用 ModelSim 2019.2 给 Vivado 2020.2 工程做仿真的几个高级技巧 对于已经熟悉Vivado与ModelSim基础联合仿真流程的开发者来说,真正的挑战往往在于如何突破常规操作的限制,在大型工程中实现高效调试。本文将分享三个经过实战验证的高…...

QQ音乐加密文件解密终极指南:qmcdump工具完全使用教程

QQ音乐加密文件解密终极指南:qmcdump工具完全使用教程 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…...

基于SpringBoot的企业客户管理系统(附源码)

项目编号050 项目获取:合集 想学习Java开发却找不到合适的项目练手?这套基于Spring Boot的企业客户管理系统就是你的最佳选择!代码简单清晰,功能实用完整,非常适合初学者学习和二次开发。 这是什么项目? …...

ADC输入噪声原理与工程优化策略

1. ADC输入噪声的本质与测量方法1.1 输入参考噪声的物理起源ADC输入参考噪声(Input-Referred Noise)本质上是由半导体器件内部的随机电子运动产生的物理现象。在模数转换器的前端电路中,主要存在两类噪声源:电阻热噪声&#xff08…...

测试测量工程师必读:从EMC暗室到传感器选型的实战解析

1. 项目概述:一场关于测试测量知识的“周五挑战”又到了周五下午,手头的项目报告写得差不多了,代码也调试得告一段落,是不是感觉大脑需要换个频道放松一下?作为一名在电子工程和测试测量领域摸爬滚打了十几年的老工程师…...

Groops实战入门:从源码编译到首个PPP案例运行

1. 认识Groops:GNSS数据处理的神器 第一次听说Groops这个软件时,我和大多数GNSS新手一样一脸茫然。直到导师扔给我一堆GRACE卫星数据,要求做精密单点定位分析时,才真正开始接触这个工具。Groops全称是Gravity Recovery Object-Ori…...