python适配器模式开发实践

1. 什么是适配器设计模式?

适配器(Adapter)设计模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁,使得它们可以一起工作,而无需修改它们的源代码。
在这里插入图片描述

  • 目标接口(Target): 定义客户端使用的接口,客户端通过该接口与适配器进行交互。
  • 适配器(Adapter): 实现目标接口,并且持有一个被适配者的实例,将客户端的请求转换为被适配者能够处理的形式。
  • 被适配者(Adaptee): 拥有一组不兼容目标接口的方法,适配器通过包装被适配者,使其能够与目标接口协同工作。
  • 客户端(Client): 通过目标接口与适配器进行交互,无需直接与被适配者打交道。

2. 设备接口示例

在给出的示例中,使用python适配器模式,设计个设备通用控制接口,以适配不同厂商的控制接口,主要功能为:

  • 初始化设备接口
  • 发送控制命令
  • 转换数据,用以适应不同设备接口要求

代码如下,不包括具体接口代码内容:

# 定义目标接口
class DataInterface:def post(self, data):pass# 初始化接口url及相关header等内容def init_url(self):pass# 第一个厂商的数据接口
class Vendor1DataInterface:def send(self, data):print("Sending data to Vendor 1 API:", data)def init(self, url):print("Init Vendor 1 API")# 第二个厂商的数据接口
class Vendor2DataInterface:def transfer(self, data):print("Transferring data to Vendor 2 API:", data)def set(self,url):print("Set Vendor 2 API")# 适配器类,用于将不同厂商的数据接口适配到目标接口
class Vendor1Adapter(DataInterface):def __init__(self, vendor1_interface):self.vendor1_interface = vendor1_interfacedef init_url(self, url):self.vendor1_interface.init(url)def post(self, data):# 在这里进行数据格式转换formatted_data = self._format_data(data)self.vendor1_interface.send(formatted_data)def _format_data(self, data):# 这里可以实现数据格式转换的逻辑,例如将数据格式转换为特定格式return f"Formatted for Vendor 1: {data}"class Vendor2Adapter(DataInterface):def __init__(self, vendor2_interface):self.vendor2_interface = vendor2_interfacedef init_url(self, url):self.vendor2_interface.set(url)def post(self, data):# 在这里进行数据格式转换formatted_data = self._format_data(data)self.vendor2_interface.transfer(formatted_data)def _format_data(self, data):# 这里可以实现数据格式转换的逻辑,例如将数据格式转换为特定格式return f"Formatted for Vendor 2: {data}"# 客户端代码
if __name__ == "__main__":# 假设要使用第一个厂商的数据接口vendor1_interface = Vendor1DataInterface()adapter1 = Vendor1Adapter(vendor1_interface)adapter1.init_url("url 1")adapter1.post("Data to Vendor 1")# 假设要使用第二个厂商的数据接口vendor2_interface = Vendor2DataInterface()adapter2 = Vendor2Adapter(vendor2_interface)adapter2.init_url("url 2")adapter2.post("Data to Vendor 2")

注:此代码改自chatgpt。

在上文的示例中,我们使用了适配器模式,以下是适配器模式的角色及其解释:

  • 目标接口(Target):
    在示例中,DataInterface 就是目标接口。它定义了客户端期望的操作,包post 方法。在适配器模式中,客户端与目标接口交互,不直接与具体的被适配者进行通信。

  • 适配器(Adapter):
    在示例中,Vendor1Adapter 和 Vendor2Adapter 是适配器。适配器实现了目标接口,并且包含一个对应的被适配者对象,它们负责将被适配者的接口转换为目标接口。适配器通过委托被适配者来实现目标接口的方法。

  • 被适配者(Adaptee):
    在示例中,Vendor1DataInterface 和 Vendor2DataInterface 是被适配者。它们是已经存在的类或接口,但是它们的接口与客户端所期望的接口不兼容。适配器将这些不兼容的接口转换为目标接口,使得客户端可以通过适配器与被适配者交互。

  • 客户端(Client):
    在示例中,客户端代码是指最后的if name == “main”: 部分。客户端通过目标接口与适配器交互,而不需要了解适配器内部是如何处理数据的。客户端不直接与被适配者交互,而是通过适配器间接与被适配者进行通信。这部分也可以直接拿出来,封装成函数来调用。

3. 小结

适配器模式的关键在于将不兼容的接口进行适配,使得它们能够协同工作,而客户端不需要关心具体的接口实现细节,只需要通过目标接口与适配器交互即可。

在给出的示例中,使用的是对象适配器模式,而不是类适配器模式。

  • 对象适配器:
    对象适配器使用组合关系来连接适配器和被适配者。在示例中,Vendor1Adapter 和 Vendor2Adapter 类通过将被适配者对象作为其一个成员变量来实现适配器功能。在对象适配器中,适配器通过调用被适配者对象的方法来实现目标接口。

  • 类适配器:
    类适配器使用继承关系来连接适配器和被适配者。适配器类同时继承目标接口和被适配者类,在适配器类中重写目标接口方法,并在重写的方法中调用被适配者类的方法来实现适配。在Python中,由于多重继承的实现复杂性和一些限制,类适配器模式在Python中不太常见。

参考:

天河书阁 VicRestart. Python 如何实现适配器设计模式?什么是适配器(Adapter)设计模式?.CSDN博客 . 2023.11
北京-临渊. Python设计模式-05-适配器模式. 博客园. 2023.06

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新在线看4K高清电影网站推荐

随着互联网技术的发展,观看高清电影已经不再是难事。这里我为大家分享几个最新的在线看4K高清电影网站,让您在家就能享受到极致观影体验。 通过下面这个即可 1. 【超清影视】 【超清影视】是国内新兴的4K高清电影网站,拥有海量的影片资源&a…

Netty源码系列 之 FastThreadLocal源码

目录 Netty优化方案之 FastThreadLocal 前言 ThreadLocal ThreadLocal是干什么的? 为什么要使用ThreadLocal工具类去操控存取目标数据到Thread线程 ? ThreadLocal的使用场景 目标数据存储到Thread线程对象的哪里? 怎么样把一个目标数据…

【Java程序设计】【C00251】基于Springboot的医院信息管理系统(有论文)

基于Springboot的医院信息管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的医院信管系统 本系统分为管理员功能模块、系统功能模块以及医生功能模块。 系统功能模块:医院信管系统,…

如何在C# Windows Forms应用程序中实现控件之间的连接线

帮我实现绘图工具多个控件连接线,请用c#代码实现 实现绘图工具中多个控件之间的连接线功能,可以通过以下几个步骤来进行: 定义连接线的数据模型:首先需要定义一个模型来表示连接线,这个模型应该包含起点和终点的坐标。…

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

java对象内部都有哪些东西

普通对象 对象头 markword 占8字节ClassPointer 指针 :-XX userCompressedClassPointrs 为4字节,不开启为 8字节实例数据 引用类型: -XX userCommpressedOops 为4字节,不开启8字节Padding对齐, 8的倍数 数组对象 对象头:markwor…

【MySQL进阶之路】亿级数据量表SQL调优实战

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称: /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

comfyui 使用教程

目录 入门通俗易懂教程 插件推荐: 动画插件 AnimateDiff: 局部重绘 人脸修复 进阶教程 comfyui换脸 AI换脸-reactor换脸插件控制AI绘画人物角色的一致性 sd对比 英文版,学英语不错: 入门通俗易懂教程 纯AI丝滑长视频教程…

STM32F1 引脚重映射功能

STM32 端口引脚重映射 文章目录 STM32 端口引脚重映射前言1、查阅芯片数据手册1.1 串口引脚重映射描述 2、代码部分2.1 核心代码部分 3、实验现象4、总结 前言 在写程序时遇到想要的端口功能,而这个引脚又被其它的功能占用了无法删除掉或直接使用,这种情…

《Python 网络爬虫简易速速上手小册》第8章:分布式爬虫设计(2024 最新版)

文章目录 8.1 分布式爬虫的架构8.1.1 重点基础知识讲解8.1.2 重点案例:使用 Scrapy 和 Scrapy-Redis 构建分布式爬虫8.1.3 拓展案例 1:使用 Kafka 作为消息队列8.1.4 拓展案例 2:利用 Docker 容器化工作节点 8.2 分布式任务管理8.2.1 重点基础…