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

八、适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间进行合作。适配器模式通过创建一个适配器类来转换一个接口的接口,使得原本由于接口不兼容无法一起工作的类可以一起工作。

主要组成部分:

  1. 目标接口(Target Interface)

    • 客户端所期望的接口。
  2. 适配器(Adapter)

    • 实现目标接口,并持有一个具体目标对象的引用,将请求委托给该对象。
  3. 不兼容的接口(Adaptee)

    • 现有代码中的一个接口,它是客户端想要使用的,但是不兼容。
  4. 客户端(Client)

    • 需要使用目标接口的代码。

优点:

  1. 灵活性:可以在不改变现有代码的情况下,替换或扩展接口。
  2. 增加可重用性:使得不兼容的接口可以通过适配器进行重用。
  3. 解耦:客户端与不兼容的接口解耦,使代码更清晰。

使用场景:

  • 当你要使用的类存在不兼容的接口时。
  • 当你希望使用一些已有的子类,而它们的接口与您需要的接口不同时。
  • 当你想要创建一个可以与多个不同的接口协同工作的类。

JAVA:

如何将不同类型的电器接口适配到统一的插头接口。

// 1、目标接口 - 电器接口
public interface ElectricSocket {void plugIn();
}
//2、具体目标-美国电器
public class AmericanDevice {public void connect() {System.out.println("连接到美国插座!");}
}
// 具体目标-欧美电器
public class EuropeanDevice {public void plug() {System.out.println("链接到欧美到插座!");}
}
// 适配器1-美国电器适配器
public class AmericanDeviceAdapter implements ElectricSocket{private AmericanDevice device;public AmericanDeviceAdapter(AmericanDevice device){this.device = device;}@Overridepublic void plugIn() {device.connect();}
}
// 适配器2-欧美适配器
public class EuropeanDeviceAdapter implements ElectricSocket{private EuropeanDevice device;public EuropeanDeviceAdapter(EuropeanDevice device){this.device = device;}@Overridepublic void plugIn() {device.plug();}
}
@Test(description = "适配器模式")public void adapterTest(){//创建一个美国电器AmericanDevice device = new AmericanDevice();ElectricSocket socket = new AmericanDeviceAdapter(device);socket.plugIn();//创建一个欧美电器EuropeanDevice device1 = new EuropeanDevice();ElectricSocket socket1 = new EuropeanDeviceAdapter(device1);socket1.plugIn();}

GO: 

假设我现在有一个运维系统,需要分别调用阿里云和 AWS 的 SDK 创建主机,两个 SDK 提供的创建主机的接口不一致,此时就可以通过适配器模式,将两个接口统一。

PS:AWS 和 阿里云的接口纯属虚构,没有直接用原始的 SDK,只是举个例子

package adapterimport "fmt"// ICreateServer 创建云主机
type ICreateServer interface {CreateServer(cpu, mem float64) error
}// AWSClient aws sdk
type AWSClient struct{}// RunInstance 启动实例
func (c *AWSClient) RunInstance(cpu, mem float64) error {fmt.Printf("aws client run success, cpu: %f, mem: %f", cpu, mem)return nil
}// AwsClientAdapter 适配器
type AwsClientAdapter struct {Client AWSClient
}// CreateServer 启动实例
func (a *AwsClientAdapter) CreateServer(cpu, mem float64) error {err := a.Client.RunInstance(cpu, mem)if err != nil {return err}return nil
}// AliyunClient aliyun sdk
type AliyunClient struct{}// CreateServer 启动实例
func (c *AliyunClient) CreateServer(cpu, mem int) error {fmt.Printf("aws client run success, cpu: %d, mem: %d", cpu, mem)return nil
}
// AliyunClientAdapter 适配器
type AliyunClientAdapter struct {Client AliyunClient
}// CreateServer 启动实例
func (a *AliyunClientAdapter) CreateServer(cpu, mem float64) error {err := a.Client.CreateServer(int(cpu), int(mem))if err != nil {return err}return nil
}
package adapterimport "testing"func TestAdapter(t *testing.T) {// 确保 adapter 实现了目标接口var a ICreateServer = &AliyunClientAdapter{Client: AliyunClient{},}err := a.CreateServer(1.0, 2.0)if err != nil {return}var w ICreateServer = &AwsClientAdapter{Client: AWSClient{},}err = w.CreateServer(2.0, 3.0)if err != nil {return}
}

相关文章:

八、适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间进行合作。适配器模式通过创建一个适配器类来转换一个接口的接口,使得原本由于接口不兼容无法一起工作的类可以一起工作。 主要组成部分: 目标…...

关于E-R图

一 什么是E-R图 E-R图(Entity-Relationship Diagram)是一种数据建模工具,用于描述数据库中实体之间的关系。它使用实体(Entity)、属性(Attribute)和关系(Relationship&#…...

DVWA通关教程

Brute Force Low 先进行一下代码审计 <?php // 检查是否通过GET请求传递了Login参数&#xff08;注意&#xff1a;这里应该是username或类似的&#xff0c;但代码逻辑有误&#xff09; if( isset( $_GET[ Login ] ) ) { // 从GET请求中获取用户名 $user $_GET[ us…...

网络学习-eNSP配置VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP广泛应用在边缘网络中&#xff0c;是一种路由冗余协议&#xff0c;它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱&#xff0c;允许主机使用单路由器&#xff0c;以及即使在实际…...

Kafka【九】如何实现数据的幂等性操作

为了解决Kafka传输数据时&#xff0c;所产生的数据重复和乱序问题&#xff0c;Kafka引入了幂等性操作&#xff0c;所谓的幂等性&#xff0c;就是Producer同样的一条数据&#xff0c;无论向Kafka发送多少次&#xff0c;kafka都只会存储一条。注意&#xff0c;这里的同样的一条数…...

JavaScript知识点1

目录 1.JavaScript中常用的数组方法有哪些&#xff1f; 2.JavaScript的同源策略&#xff1f; 3.JavaScript中的 NaN 是什么&#xff1f; 4.JavaScript中的split、slice、splice函数区别&#xff1f; 1.JavaScript中常用的数组方法有哪些&#xff1f; 在 JavaScript 中&…...

51单片机个人学习笔记11(AT24C02-I2C总线)

前言 本篇文章属于STC89C52单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 [1-1] 课程简介_哔哩…...

创建Java项目,可实现main方法运行,实现对性能数据的处理

1、Android Studio无法执行Java类的main方法问题及解决方法 Android Studio无法执行Java类的main方法问题及解决方法_delegatedbuild-CSDN博客 D:\workspaces\performanceTools\.idea 文件夹下&#xff0c;gardle.xml ,添加依赖 <option name"delegatedBuild"…...

JavaWeb(后端)

MVC MVC 就是 Model View Controller 的缩写&#xff0c;属于一种软件架构设计模式一种思想&#xff0c;把我们的项目分为控制器&#xff08;Controller&#xff09;、模型&#xff08;Model&#xff09;、视图&#xff08;view&#xff09;三个部分&#xff0c;model就是处理…...

828华为云征文 | 华为云Flexusx实例,高效部署Servas书签管理工具的优选平台

前言 华为云Flexus X实例&#xff0c;Servas书签管理工具部署的优选平台&#xff01;828节日特惠&#xff0c;让高效管理您的知识宝藏触手可及。Flexus X实例以其卓越的算力、灵活的资源配置和智能调优技术&#xff0c;为Servas提供了稳定、高效的运行环境。无论是快速访问、安…...

分治法和动态规划法

一、分治法&#xff08;Divide and Conquer&#xff09; 定义 分治法是一种将大问题分解成若干个小问题&#xff0c;递归地解决这些小问题&#xff0c;然后将这些小问题的解合并起来得到原问题的解的算法策略。&#xff08;子问题之间相互独立&#xff09; 基本步骤 1.分解…...

【FreeRL】我的深度学习库构建思想

文章目录 前言参考python环境效果已复现结果 综述DQN.py&#xff08;主要&#xff09;算法实现参数修改细节实现显示训练&#xff0c;保存训练 Buffer.pyevaluate.pylearning_curves 前言 代码实现在:https://github.com/wild-firefox/FreeRL 欢迎star 参考 动手学强化学习e…...

Docker部署nginx容器无法访问80端口

问题说明 在阿里云ECS服务器上部署一台CentOS服务器&#xff0c;然后在里面安装了docker服务。用docker部署了nginx&#xff0c;开启docker中的nginx服务&#xff0c;映射宿主机端口80 把阿里云服务器上面的安全组放开了80端口 但是还是无法访问nginx的80web界面 问题分析 查…...

Python语言开发学习之使用Python预测天气

什么是wttr&#xff1f; 使用Python预测天气的第一步&#xff0c;我们要了解wttr是什么。wttr.in是一个面向控制台的天气预报服务&#xff0c;它支持各种信息表示方法&#xff0c;如面向终端的ANSI序列(用于控制台HTTP客户端(curl、httpie或wget))、HTML(用于web浏览器)或PNG(…...

minio实现大文件断点续传

最近工作中遇到一个需求&#xff0c;用户需要上传大文件几百M&#xff0c;为了更好的用户体验&#xff0c;需要支持断点续传&#xff0c;秒传&#xff0c;上传进度条等功能。需求如下&#xff1a; 方案有两种&#xff1a; 第一种&#xff1a;前端直接将整个大文件丢到后端&…...

Qt绘制动态仪表(模仿汽车仪表指针、故障灯)

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…...

【视频教程】GEE遥感云大数据在林业中的应用与典型案例实践

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…...

【时时三省】c语言例题----华为机试题<字符串排序>

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 1&#xff0c;题目 HJ14 字符串排序 描述 给定 n 个字符串&#xff0c;请对 n 个字符串按照字典序排列。 数据范围&#xff1a; 1≤n≤1000 1≤n≤1000 &#xff0c;字符串长度满足 1≤l…...

基于vue框架的城市体育运动交流平台15s43(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,赛事类型,近期赛事,比赛报名,器材类型,器材信息,自由约战,运动队伍 开题报告内容 基于Vue框架的城市体育运动交流平台开题报告 一、项目背景与意义 随着城市化进程的加速和居民健康意识的提升&#xff0c;城市体育运动已成为现代…...

2024年软件测试经典大厂面试题(全3套)【包含答案】

前言 金三银四即将过去&#xff0c;后面迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。…...

突破B站字幕处理瓶颈:BiliBiliCCSubtitle全流程解决方案

突破B站字幕处理瓶颈&#xff1a;BiliBiliCCSubtitle全流程解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 一、问题发现&#xff1a;字幕处理的现实困境…...

Cogito 3B实战案例:GitHub PR描述自动生成+变更点总结

Cogito 3B实战案例&#xff1a;GitHub PR描述自动生成变更点总结 1. 快速了解Cogito 3B模型 Cogito v1预览版是Deep Cogito推出的混合推理模型系列&#xff0c;这个3B版本在大多数标准基准测试中都表现出色&#xff0c;超越了同等规模的其他开源模型。简单来说&#xff0c;它…...

Cursor Pro功能持续访问解决方案:系统化AI编程助手权限管理方法论

Cursor Pro功能持续访问解决方案&#xff1a;系统化AI编程助手权限管理方法论 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reach…...

**Flutter实战进阶:用自定义RenderObject打造高性能图表组件**在Flutter开发中,我们经

Flutter实战进阶&#xff1a;用自定义RenderObject打造高性能图表组件 在Flutter开发中&#xff0c;我们经常需要展示复杂的数据可视化效果&#xff0c;比如折线图、柱状图等。虽然社区已有不少成熟的图表库&#xff08;如charts_flutter&#xff09;&#xff0c;但它们往往无法…...

HY-MT1.5-1.8B功能体验:格式保留翻译,完美处理srt字幕和网页标签

HY-MT1.5-1.8B功能体验&#xff1a;格式保留翻译&#xff0c;完美处理srt字幕和网页标签 1. 引言&#xff1a;翻译模型的新挑战 在全球化内容爆炸式增长的今天&#xff0c;传统翻译工具面临两大核心痛点&#xff1a; 格式丢失问题&#xff1a;翻译srt字幕、HTML网页等内容时…...

HsMod终极指南:5步打造你的专属炉石传说模改体验

HsMod终极指南&#xff1a;5步打造你的专属炉石传说模改体验 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架的炉石传说模改插件&#xff0c;为玩家提供全面的游戏体验…...

IntelliJ IDEA 2026.1 版本发布,多维度升级助力开发体验

AI 能力拓展&#xff1a;内置多 Agent 提升开发效率IntelliJ IDEA 2026.1 版本在 AI 方面有显著升级&#xff0c;内置支持更多 AI agent&#xff0c;如 Codex、Cursor 以及任何兼容 ACP 的 agent。ACP Registry 实现了一键浏览和安装 AI agent&#xff0c;方便开发者快速引入所…...

数据库课程设计好帮手:Phi-4-mini-reasoning辅助ER图设计与SQL优化

数据库课程设计好帮手&#xff1a;Phi-4-mini-reasoning辅助ER图设计与SQL优化 1. 课程设计的痛点与解决方案 每到学期末&#xff0c;计算机专业的学生们都会面临一个共同的挑战——数据库课程设计。这个需要完成ER图设计、SQL编写和文档撰写的综合项目&#xff0c;常常让初学…...

PyTorch 2.8镜像实际效果:torch.compile+FlashAttention-2双优化下的吞吐量提升对比

PyTorch 2.8镜像实际效果&#xff1a;torch.compileFlashAttention-2双优化下的吞吐量提升对比 1. 镜像环境与技术亮点 PyTorch 2.8深度学习镜像为开发者提供了一个开箱即用的高性能计算环境。基于RTX 4090D 24GB显卡和CUDA 12.4的深度优化组合&#xff0c;这个镜像特别适合需…...

饭局下半场,别人忙着解酒,我从开局就赢在酒杯里

1. 饭局如战场&#xff0c;后半场才是真正的考验任何一场饭局&#xff0c;都可以被分成两个阶段。前半场&#xff0c;推杯换盏&#xff0c;人人意气风发。酒过三巡&#xff0c;大家还在比拼谁喝得多、谁喝得猛&#xff0c;气氛热烈而体面。但到了后半场&#xff0c;画风开始分裂…...