八、适配器模式

news2024/9/20 7:58:27

适配器模式(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;
    }

    @Override
    public void plugIn() {
        device.connect();
    }
}
// 适配器2-欧美适配器
public class EuropeanDeviceAdapter implements ElectricSocket{
    private EuropeanDevice device;

    public EuropeanDeviceAdapter(EuropeanDevice device){
        this.device = device;
    }
    @Override
    public 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 adapter

import "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 adapter

import "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
	}
}

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

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

相关文章

CUDA-中值滤波算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 中值滤波是一种常用的图像处理方法,特别适用于去除图像中的脉冲噪声(如椒盐噪声)。…

基于IOT的供电房监控系统(实物)

aliyun_mqtt.cpp 本次设计利用ESP8266作为系统主控,利用超声波检测门的状态,利用DHT11检测环境温湿度、烟雾传感器检测空气中的气体浓度,利用火焰报警器模块检测火焰状态,使用OLED进行可视化显示,系统显示传感器数据&a…

同相放大器电路设计

1 简介 同相放大电路输入阻抗为运放的极高输入阻抗(GΩ级),因此可处理高阻抗输入源信号。同相放大器的共模电压等于输入信号。 2 设计目标 2.1 输入 2.2 输出 2.3 频率 2.4 电源 3 电路设计 根据设计目标,最终设计的电路结构…

python-确定进制

题目描述 6 942 对于十进制来说是错误的,但是对于 13 进制来说是正确的。即 6(13)​ 9(13)​42(13)​,而 42(13)​4 13^12 13^054(10)​。 你的任务是写一段程序读入三个整数 p,q 和 r,然后确定一个进制 B(2≤B≤16) 使得 p qr 。如果 B 有…

Vue3: 使用ref自动补齐.value

目录 一.老版本(已经弃用TypeScript Vue Plugin (Volar)) 二.新版本(Vue - Official) 三.勾选后重启VScode 四.效果 VScode中搜索Vue - Official插件 一.老版本(已经弃用TypeScript Vue Plugin (Volar)&#xff0…

学习之git的远程仓库操作的常用命令

1 git remote -v 查看当前所有远程地址别名 2 git remote add 别名 远程地址 3 git push 别名 分支(本地分支名称) 推送本地分支到远程仓库 4 git pull 远程库别名 远程分支别名 拉取远程库分支(更新代码) 5 git clone 远程库地址…

【时间盒子】-【6.任务页面】在同一个页面新建、编辑任务

Tips: Column组件的使用; color.json资源文件的使用。 一、页面布局 页面分为三个部分,从上往下分别是:标题菜单栏、时间选择器和任务列表。每个部分都可以设计为独立的组件,后续文章分别介绍。 二、新建页面 右击pages目录&…

Vue:指令

目录 指令概念内容渲染指令**{{ }}****v-text****v-html** 属性绑定指令 v-bind绑定属性**绑定class****绑定style**动态绑定属性**绑定对象** 事件绑定指令 v-onv-on 基础event**$event** 双向绑定指令 v-modelv-model 基础v-model 值绑定**v-model 指令的修饰符** 条件渲染指…

解锁全球机遇:澳大利亚服务器租用市场的独特魅力

在浩瀚的全球数字版图中,澳大利亚以其独特的地理位置、丰富的资源禀赋、以及日益增长的数字经济活力,成为了众多互联网企业竞相布局的重要市场。特别是当谈及服务器租用这一关键环节时,澳大利亚以其稳定的网络环境、先进的基础设施和开放的市…

使用原生HTML的drag实现元素的拖拽

HTML 拖放(Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能。例如,用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按…

GPIO 简介(STM32F407)

一、GPIO简介 什么是GPIO GPIO即通用输入输出端口,全称General Purpose Input Output,是控制或者采集外部器件的信息的外设,即负责输入输出。 它按组分配存在,每组最多16个IO口,组数视芯片而定。比如STM32F407ZGT6是…

今年中秋节买什么东西划算?精选五款好物清单合集推荐!

谈及中秋佳节选购什么好物,你可真是找对人了!作为一位专注于节日氛围与生活美学的博主,对于哪些中秋好物能为您的佳节增添温馨与喜悦,我可是了如指掌。恰逢中秋佳节临近,各大商家纷纷推出精彩纷呈的优惠活动&#xff0…

AI产品经理必备技能:技术与能力升级图谱

目 录 CONTENTS 前言 第1章 AI产品经理——不是简单的“当产品经理遇上“AI” 001 1.1 三大浪潮看AI技术发展 002 1.2 AI产品和AI产品经理 003 1.3 成为AI产品经理三步走 011 1.3.1 第一步:找到自己的糖山 011 1.3.2 第二步:找到自己的比较优势 …

联合谱低秩先验和深度空间先验的高光谱图像无监督去噪

高光谱图像(Hyperspectral Image, HSI)具有丰富的光谱信息,广泛应用于遥感、环境监测和医学成像等领域。然而,高光谱图像常常受到噪声的干扰,这会影响后续的数据分析和应用。因此,设计有效的去噪算法是高光…

计算机毕业设计选题推荐-线上花店系统-鲜花配送系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

玩归龙潮手机配置低、卡顿发烫、内存不足 GameViewer远程助你手机畅玩归龙潮

国潮RPG动作游戏《归龙潮》终于在9月13日迎来公测!要是你担心自己的手机配置低,会出现卡顿发烫、内存不足等问题,可以通过网易GameViewer远程助你手机远控电脑畅玩归龙潮。 GameViewer远程作为专为游戏玩家打造的远程控制软件,用它…

价值流:从理论框架到实践落地的系统化指南

价值流如何从理论转化为实践中的企业增长引擎 随着全球化和数字化进程的加快,企业面临的竞争压力日益加剧。如何在竞争激烈的市场中立足并实现持续增长,已经成为每一个企业管理者需要面对的重要议题。作为一种强调客户价值创造的工具,《价值…

2024年8月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2024年8月国产数据库大事件和重要产品发布消息。 目录 2024年8月国产数据库大事记 TOP102024年8月国产数据库大事记(时间线)产品/版本发布兼容认证代表厂商大事记厂商活动 【VLDB2024分享和相关论文】其它活动相关资料 厂商财报…

【STM32】OLED

OLED显示原理 OLED使用的是I2C协议,使用ssd1306芯片对所有灯进行控制,如果一个灯需要一个引脚的话,屏幕分为8页,每页有128列,8行 . 共有128* 88个灯 这样引脚是算不过来的,所以我们使用了ssd1306芯片&…

C/C++语言基础--预编译指令、宏定义(带参宏、宏函数)、头文件重复包含解决方法等

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 宏定义是C/C最伟大的发明之一,甚至有人认为他比指针还伟大,它能够极大简化代码,因此学习宏定义是非常有必要的但是由于他只是简单的替换,故在C的efficiency书籍中…