八、适配器模式

devtools/2024/9/23 15:23:26/

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


http://www.ppmy.cn/devtools/110747.html

相关文章

【C++ Primer Plus习题】15.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <cmath> #incl…

CSS-2

1.像素 2.颜色 rgba --- (255,255,255,0) --- a是透明度 hexa --- #ff00aabb -- a是透明度 hsla --- hsla(色相&#xff0c;饱和度&#xff0c;亮度&#xff0c;透明度) --- a依旧 3.字体 4.文本 5.列表相关属性 6.边框相关…

怎么利用XML发送物流快递通知短信

现如今短信平台越来越普遍了&#xff0c;而短信通知也分很多种&#xff0c;例如服务通知、订单通知、交易短信通知、会议通知等。而短信平台在物流行业通知这一块作用也很大。在家时:我们平时快递到了&#xff0c;如果电话联系不到本人&#xff0c;就会放到代收点&#xff0c;然…

【软考】安全威胁

目录 1. 说明2. 典型的安全威胁2.1 授权侵犯2.2 拒绝服务2.3 窃听2.3 信息泄露2.4 截获/修改2.5 假冒2.6 否认2.7 非法使用2.8 人员疏忽2.9 完整性破坏2.10 媒体清理2.11 物理入侵2.12 资源耗尽 3. 例题3.1 例题1 1. 说明 1.随着信息交换的激增&#xff0c;安全威胁所造成的危…

计网简简单单复习一下

文章目录 基础体系结构(分层模型)为什么要分层?OSI 七层模型?每一层的作用?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议每一层常见协议有哪些?从输入 URL 到页面展示到底发生了什么?URI和URL的区别;forward和redirect的区别DNS作用是什么?D…

uniapp 携带网址跳转webview页面报错解决

然后红框中的代码正常执行的 解决方案&#xff1a; 向webview页面携带参数时做以下处理&#xff1a; 接参后做以下处理&#xff1a; 效果展示&#xff1a;

鸿蒙界面开发——组件(7):组件导航 页面路由

组件导航 (Navigation)(推荐) Navigation() Navigation(pathInfos: NavPathStack)Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换&#xff0c…

【Python】Python 中的文件

一、文件的概念 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失. 要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在 文件 中保存 通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下: 文本文件 (txt)可执行文件 (exe, dll…