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

设计模式之适配器模式

一、概述

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

二、适用性

1.你想使用一个已经存在的类,而它的接口不符合你的需求。

2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作。

3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行 子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

三、参与者

1.Target 定义Client使用的与特定领域相关的接口。

2.Client 与符合Target接口的对象协同。

3.Adaptee 定义一个已经存在的接口,这个接口需要适配。

4.Adapter 对Adaptee的接口与Target接口进行适配

四、类图

五、示例

Target接口

public interface Target {void adapteeMethod();void adapterMethod();
}

 Adaptee类

public class Adaptee {public void adapteeMethod() {System.out.println("Adaptee method!");}
}

适配器类Adapter

public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee){this.adaptee = adaptee;}@Overridepublic void adapteeMethod() {adaptee.adapteeMethod();}@Overridepublic void adapterMethod() {System.out.println("Adapter method!");}
}

测试类

public class TestAdapter {@Testpublic void ruleTest() {Target target = new Adapter(new Adaptee());target.adapteeMethod();target.adapterMethod();}
}

测试结果

Connected to the target VM, address: '127.0.0.1:3881', transport: 'socket'
Adaptee method!
Adapter method!
Disconnected from the target VM, address: '127.0.0.1:3881', transport: 'socket'

 六、实践

文件中心服务开发。

文件操作适配相关总体目录

自研文件服务相关

/*** @author* @createTime 2021年01月15日* @Description 自研文件服务接口*/
public interface IFileOperateService {/*** 上传文件* @param dto 参数* @return 文件id*/String upload(FileUploadDto dto);/*** 流式上传文件* @param streamDto 参数* @return 文件id*/String upload4Stream(FileUploadForStreamDto streamDto);/*** 下载文件* @param fileId 文件id* @return 结果*/FileDownloadDto download(String fileId);/*** 流式下载文件* @param fileId 文件id* @return 结果*/FileDownloadForStreamDto download4Stream(String fileId);
}

 实现

/*** @author* @createTime 2021年01月15日* @Description 自研文件服务实现*/
public class CustomFileOperateServiceImpl implements IFileOperateService {@Overridepublic String upload(FileUploadDto dto) {System.out.println("自研文件服务上传文件...");return null;}@Overridepublic String upload4Stream(FileUploadForStreamDto streamDto) {System.out.println("自研文件服务流式上传文件...");return null;}@Overridepublic FileDownloadDto download(String fileId) {System.out.println("自研文件服务下载文件...");return null;}@Overridepublic FileDownloadForStreamDto download4Stream(String fileId) {System.out.println("自研文件服务流式下载文件...");return null;}
}

第三方文件相关

/*** @author* @createTime 2021年01月15日* @Description 第三方文件服务接口*/
public interface IThirdPartyFileOperateService {/*** 上传文件* @param dto 参数* @return 文件id*/String upload(FileUploadDto dto);/*** 流式上传文件* @param streamDto 参数* @return 文件id*/String upload4Stream(FileUploadForStreamDto streamDto);/*** 下载文件* @param fileId 文件id* @return 结果*/FileDownloadDto download(String fileId);/*** 流式下载文件* @param fileId 文件id* @return 结果*/FileDownloadForStreamDto download4Stream(String fileId);
}

实现

/*** @author* @createTime 2021年01月15日* @Description 阿里oss服务*/
public class AliOssFileOperateServiceImpl implements IThirdPartyFileOperateService {@Overridepublic String upload(FileUploadDto dto) {System.out.println("oss文件服务上传文件...");return null;}@Overridepublic String upload4Stream(FileUploadForStreamDto streamDto) {System.out.println("oss文件服务流式上传文件...");return null;}@Overridepublic FileDownloadDto download(String fileId) {System.out.println("oss文件服务下载文件...");return null;}@Overridepublic FileDownloadForStreamDto download4Stream(String fileId) {System.out.println("oss文件服务流式下载文件...");return null;}
}

声明一个统一的适配标准

/*** @author * @createTime 2021年01月15日* @Description*/
public interface FileOperateAdaptee extends IThirdPartyFileOperateService {
}

适配器-CustomFileOperateAdaptor

/*** @author * @createTime 2021年01月15日* @Description*/
public class CustomFileOperateAdaptor implements FileOperateAdaptee {private final IFileOperateService customFileOperationService;public CustomFileOperateAdaptor(IFileOperateService customFileOperationService) {this.customFileOperationService = customFileOperationService;}@Overridepublic String upload(FileUploadDto dto) {return customFileOperationService.upload(dto);}@Overridepublic String upload4Stream(FileUploadForStreamDto streamDto) {return customFileOperationService.upload4Stream(streamDto);}@Overridepublic FileDownloadDto download(String fileId) {return customFileOperationService.download(fileId);}@Overridepublic FileDownloadForStreamDto download4Stream(String fileId) {return customFileOperationService.download4Stream(fileId);}
}

适配器-MultiWriteAndReadCustomOperateAdaptor

/*** @author* @createTime 2021年01月15日* @Description 上传时多写,读取时优先从自研文件服务中读取的适配器*/
public class MultiWriteAndReadCustomOperateAdaptor extends AbstractFileMultiWriteOperateAdaptor {public MultiWriteAndReadCustomOperateAdaptor(IFileOperateService fileOperationService, IThirdPartyFileOperateService thirdPartyFileOperationService) {super(fileOperationService, thirdPartyFileOperationService);}@Overridepublic String upload(FileUploadDto dto) {System.out.println("MultiWriteAndRead文件服务上传文件...");return null;}@Overridepublic String upload4Stream(FileUploadForStreamDto streamDto) {System.out.println("MultiWriteAndRead文件服务流式上传文件...");return null;}@Overridepublic FileDownloadDto download(String fileId) {System.out.println("MultiWriteAndRead文件服务下载文件...");return null;}@Overridepublic FileDownloadForStreamDto download4Stream(String fileId) {System.out.println("MultiWriteAndRead文件服务流式下载文件...");return null;}
}

文件服务工厂-FileOperateFactory

/*** @author* @createTime 2021年01月15日* @Description 文件服务工厂*/
public class FileOperateFactory {public static IThirdPartyFileOperateService getDefault() {return getInstance(EnumFileOperateType.MULTI_WRITE_AND_READ_FROM_CUSTOM);}/*** 获取对应的文件服务实例* @param operationType 类型* @return 实例*/public static IThirdPartyFileOperateService getInstance(EnumFileOperateType operationType) {switch (operationType) {case OSS:return new AliOssFileOperateServiceImpl();case CUSTOM:return  new CustomFileOperateAdaptor(new CustomFileOperateServiceImpl());case MULTI_WRITE_AND_READ_FROM_CUSTOM:return  new MultiWriteAndReadCustomOperateAdaptor(new CustomFileOperateServiceImpl(),new AliOssFileOperateServiceImpl());default:throw new IllegalArgumentException("storageType is not support");}}
}

自测

@Test
public void fileTest() {IThirdPartyFileOperateService operateService =            FileOperateFactory.getInstance(EnumFileOperateType.MULTI_WRITE_AND_READ_FROM_CUSTOM);operateService.upload(new FileUploadDto());operateService.download("this is fileId");
}

自测结果

Connected to the target VM, address: '127.0.0.1:6502', transport: 'socket'
MultiWriteAndRead文件服务上传文件...
MultiWriteAndRead文件服务下载文件...
Disconnected from the target VM, address: '127.0.0.1:6502', transport: 'socket'

相关文章:

设计模式之适配器模式

一、概述 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 二、适用性 1.你想使用一个已经存在的类,而它的接口不符合你的需求。 2.你想创建一个可以复用的类,该类可以与其他不…...

让ChatGPT介绍一下ChatGPT(ChatGPT的自我介绍)

ChatGPT是这样介绍自己的: ChatGPT是由OpenAI开发的一种基于大规模预训练的语言模型。它是建立在GPT(Generative Pre-trained Transformer)架构的基础上,经过大量的数据训练而成。 ChatGPT旨在通过对话与用户进行交互&#xff0…...

CentOS 7 构建 LVS-DR 群集

一、LVS-DR集群摘要 LVS(Linux Virtual Server)是一个用于构建可扩展和高可用性的负载均衡集群的软件。它基于Linux操作系统,并提供了一种将网络流量分发到多个后端服务器的机制。 二、基本工作原理 配置负载均衡器:在LVS集群中…...

MySQL8.0.33二进制包安装与部署

官方文档 https://downloads.mysql.com/archives/community/https://dev.mysql.com/doc/refman/8.1/en/binary-installation.html官方文档操作步骤 # Preconfiguration setup $> groupadd mysql $> useradd -r -g mysql -s /bin/false mysql # Beginning of source-build…...

RocketMQ发送消息失败:error CODE: 14 DESC: service not available now, maybe disk full

在执行业务时,发现MQ控制台没有查询到消息,在日志中发现消息发送失败,报错error CODE: 14 DESC: service not available now, maybe disk full 分析报错应该是磁盘空间不足,导致broker不能进行正常的消息存储刷盘,去查…...

1.Fay-UE5数字人工程导入(UE数字人系统教程)

非常全面的数字人解决方案(含源码) Fay-UE5数字人工程导入 1、工程下载:xszyou/fay-ue5: 可对接fay数字人的ue5工程 (github.com) 2、ue5下载安装:Unreal Engine 5 3、ue5插件安装 依次安装以下几个插件 4、双击运行工程 5、切换中文 6、检…...

Linux 终端操作命令(2)内部命令分类

Linux 终端操作命令 也称Shell命令,是用户与操作系统内核进行交互的命令解释器,它接收用户输入的命令并将其传递给操作系统进行执行,可分为内部命令和外部命令。内部命令是Shell程序的一部分,而外部命令是独立于Shell的可执行程序…...

【数据结构与算法】十大经典排序算法-插入排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…...

如何使用PHP Smarty进行条件判断和循环?

欢迎来到PHP Smarty的世界!如果你想要在Smarty中执行条件判断和循环,那么你需要了解一些基本的语法和结构。 首先,让我们从条件判断开始吧!在Smarty中,你可以使用{if}、{elseif}和{else}语句来进行条件判断。这些语句的…...

使用svg生成图像

使用svg生成图像 每个HTML开发人员都应该对可伸缩的向量图形有一个基本的理解。本文会通过使用svg创建一个雨伞图像来介绍一下svg的基本知识。 svg介绍 SVG 意为可缩放矢量图形(Scalable Vector Graphics)。是一种可以在HTML中创建图像的方式。 我们…...

DNS、ARP

目录 DNS以及它的用途 DNS的解析方式 DNS的查询方式 DNS使用TCP/UDP DNS劫持 常见的DNS劫持现象 DNS劫持与HTTP劫持的不同 处理DNS劫持 DNS缓存 DNS实现负载均衡 ARP以及他的工作原理 DNS以及它的用途 DNS是域名解析服务器,用来将域名解析成IP。DNS工作在…...

uniapp 微信小程序 echarts地图 点击显示类目

效果如图: 在tooltip内axisPointer内添加 label:{show:true} 即可显示“请求离婚”的标题...

速刷算法#Day-02

有序数组的平方 方法一&#xff1a;暴力求解 排序 暴力先求平方&#xff0c;然后NT直接用sort这个方法首先对数组中的每个元素求平方&#xff0c;然后进行排序。下面是对应的C代码&#xff1a; class Solution { public:vector<int> SortedSquare(vector<int>&…...

Java怎么手动将对象注入到springboot

在Java中&#xff0c;可以使用Spring的ApplicationContext来手动将对象注入到Spring Boot中。 1. 首先&#xff0c;确保你已经在Spring Boot应用程序中引入了Spring的依赖&#xff0c;比如 spring-boot-starter 。 2. 在你的类中注入ApplicationContext对象&#xff1a; Autowi…...

twisted 18.7.0 requires PyHamcrest>=1.9.0 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

电脑关机程序

//关机程序 1、电脑运行起来后&#xff0c;1分钟内关机。 2、如果输入&#xff1a;我是猪。就取消关机。 #include<stdio.h> #include<string.h> int main() { char input[20] { 0 }; system("shutdown -s -t 60"); again: printf(&quo…...

构建之法 - 软工教学:每天都向前推进一点点

作者&#xff1a;福州⼤学 汪璟玢⽼师 汪老师&#xff1a;每次都向前推进一点点&#xff0c;哪怕只有一点点&#xff0c;也好过什么都不做。 ​邹老师&#xff1a;对&#xff0c;几个学期下来&#xff0c;就已经超过那些“空想”的团队很远了。坚持下去&#xff01; 汪老师&…...

基于Qlearning强化学习的路径规划算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Q值更新规则 4.2 基于Q-learning的路径规划算法设计 4.3 Q-learning路径规划流程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..…...

ASL国产CS5213 转VGA信号输出音频 替代AG6200安格芯片 HDMI to VGA(带音频)方案设计原理图

CS5213功能&#xff1a;HDMI转VGA带音频输出&#xff0c;专注于设计HDMI转VGA带音频输出。可替代AG6200 AG6201。 CS5213芯片是一个HDMI&#xff08;高清多媒体接口&#xff09;到VGA桥接芯片。 它将HDMI信号转换为标准VGA信号它可以在适配器、智能电缆等设备中设计。 Capst…...

springboot启动忽略某些类

springboot启动忽略某些类 描述解决方案单拉一个提交&#xff0c;把所有的涉及kafka消费的都不注入容器通过配置ComponentScan的excludeFilters配置了不生效后续处理改之前改之后解释 总结 拆分环境 感触解决实现demo参考 描述 目前我这的开发环境和测试环境数据库是两份&#…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...