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

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

设计基本步骤

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);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2023版 STM32实战4 滴答定时器精准延时

SysTick简介与特性 -1- SysTick属于系统时钟。 -2- SysTick定时器被捆绑在NVIC中。 -3- SysTick可以产生中断,且中断不可屏蔽。 SysTick的时钟源查看 通过时钟树可以看出滴答的时钟最大为72MHZ/89MHZ 通过中文参考手册也可以得到这个结论 代码编写(已经验证&a…

【kubernetes】kubernetes中的Ingress使用

文章目录 1 Service和Endpoint1.1 服务的转发1.2 headless service及其使用场景1.3 服务的类型 2 Ingress3 ingress controller4 IngressClass5 nginx-ingress-controller 1 Service和Endpoint k8s中运行的最小单位是Pod,如果单独运行Pod,没有用控制器进…

算法通过村第十一关-位运算|白银笔记|高频题目

文章目录 前言1. 位移的妙用1.1 位1的个数1.2 比特位计算1.3 颠倒无符号整数 2. 位实现加减乘除专题2.1 位运算实现加法2.2 递归乘法 总结 前言 提示:他不是不想多明白些,但是每每在该用脑子的时候,他用了感情。 --老舍《黑白李》 与位运算和…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建项目 / 创建核心类

文章目录 一、创建SpringBoot项目二、创建核心类创建 Exchange类创建 MSGQueue类创建 Binding类创建Message类 一、创建SpringBoot项目 在项目中添加这四个依赖! 二、创建核心类 交换机 :Exchange 队列 :Queue 绑定关系: Binding 消息 :Message 这些核心类都存在于 BrokerSe…

使用U3D、pico开发VR(二)——添加手柄摇杆控制移动

一、将unity 与visual studio 相关联 1.Edit->Preference->External tool 选择相应的版本 二、手柄遥控人物转向和人物移动 1.添加Locomotion System组件 选择XR Origin; 2.添加Continuous Move Provider(Action-based)组件 1>…

visual studio的安装及scanf报错的解决

visual studio是一款很不错的c语言编译器 下载地址:官网 点击后跳转到以下界面 下滑后点击下载Vasual Sutdio,选择社区版即可 选择位置存放下载文件后,即可开始安装 安装时会稍微等一小会儿。然后会弹出这个窗口,我们选择安装位…

【GESP考级C++】1级样题 闰年统计

GSEP 1级样题 闰年统计 题目描述 小明刚刚学习了如何判断平年和闰年,他想知道两个年份之间(包含起始年份和终止年份)有几个闰年。你能帮帮他吗? 输入格式 输入一行,包含两个整数,分别表示起始年份和终止…

快速开发微信小程序之一登录认证

一、背景 记得11、12年的时候大家一窝蜂的开始做客户端Android、IOS开发,我是14年才开始做Andoird开发,干了两年多,然后18年左右微信小程序火了,我也做了两个小程序,一个是将原有牛奶公众号的功能迁移到小程序&#x…

【RocketMQ】(八)Rebalance负载均衡

消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不…

【Linux】线程概念

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ Linux       🛰️社区 :✈️ 进步学堂       &#x1f6f0…

[VIM]VIM初步学习-3

3-1 编写 vim 配置,我的 vim 我做主_哔哩哔哩_bilibili

C# DeOldify 黑白照片 老照片上色

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System…

NPDP产品经理知识(市场调研-文化,团队,领导力)

--- VOC --- 市场调研的关键步骤 1.> 定义问题 2.>定义结果的准确度 3.>收集数据 4.>分析和解读数据 5.>得出结论 6.>实施 --- 二级市场研究/一级市场研究 --- 定性 > 焦点小组 > 深度访谈 > 人种学(On-Site In-Home) > 客户…

Rust 使用Cargo

Rust 使用技巧 Rust 使用crates 假设你正在编写一个 Rust 程序,要使用一个名为 rand 的第三方库来生成随机数。首先,你需要在 Cargo.toml 文件中添加以下依赖项: toml [dependencies] rand "0.7.3" 然后运行 cargo build&…

C++ 学习系列 -- std::stack 与 std::queue

一 std::stack 与 std::queue 分别是什么? 两者均是 c 中的序列化容器,区别在于: std::stack 元素是先进后出 std::queue 元素是先进先出 二 std::stack 与 std::queue 原理 1 std:statck 2. std::queue 两者底层容器可以是 list 也可以…

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

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

GraphQL全面深度讲解

目录 一、GraphQL 是什么 二、GraphQL 规范 数据模型 字段 参数 三、运行示例 四、优势和劣势 优势 劣势 一、GraphQL 是什么 GraphQL 是一种用于 API 的查询语言,也是一个基于服务端的运行引擎。 GraphQL 提供了一套完整的规范和描述用于查询 API&#xf…

Sketch mac98.3(ui设计矢量绘图)

Sketch Mac是一款矢量绘图软件,适用于UI设计、网页设计、图标制作等领域。以下是Sketch Mac的一些主要特点: 简单易用的界面设计:Sketch Mac的用户界面简洁明了,使得用户可以轻松上手操作,不需要复杂的学习过程。强大…

【QT】自定义组件ui类添加到主ui界面方法

1.添加自定义组件到项目中 add new选择如下 写好类方法,确定即可 2.将新创建的ui类加入到主ui界面 选中新创建ui类的父类空块,右键选择提升为 选择并添加新创建的类

【目标检测】——Gold-YOLO为啥能超过YOLOV8

华为 https://arxiv.org/pdf/2309.11331.pdf 文章的出发点:FPN中的信息传输问题 1. 简介 基于全局信息融合的概念,提出了一种新的收集和分发机制(GD),用于在YOLO中进行有效的信息交换。通过全局融合多层特征并将全局信…