python适配器模式开发实践

news2024/12/26 22:33:01

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_interface

    def 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_interface

    def 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.coloradmin.cn/o/1445171.html

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

相关文章

数字孪生:构建未来智慧社区的关键技术

随着科技的快速发展,数字孪生技术作为构建未来智慧社区的关键技术,正逐渐受到广泛关注。数字孪生技术能够实现物理世界与数字世界的交互映射,为智慧社区的建设提供强有力的支持。本文将探讨数字孪生技术在构建未来智慧社区中的作用和意义&…

蓝牙BLE学习

1. 简介 1.1 蓝牙发展历程 蓝牙,直接来自于一位国王的名字--King Harald ‘Bluetooth Gromsson。这位国王因两件事留名于史,其一是在公园958年统一了丹麦和挪威,其二是在其死后,其牙齿呈现出暗蓝色的颜色,因而得名蓝牙…

【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便

1,视频地址: https://www.bilibili.com/video/BV1Pz421d7s4/ 【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功&…

Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b,一个操作 f f f 定义操作 f f f为, a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …

电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真

1.设计要求 设计、制作一个纪念馆游客进出自动计数显示器。 某县,有一个免费参观的“陶渊明故里纪念馆”,游客进出分道而行,如同地铁有确保单向通行的措施。在入口与出口处分别设有红外检测、声响、累加计数器装置,当游人进&#…

fast.ai 机器学习笔记(一)

机器学习 1:第 1 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-1-84a1dc2b5236 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更…

【蓝桥杯省赛真题23】python水仙花数 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python水仙花数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python水仙花数 第十二届蓝桥杯青少年组python比赛省赛真题 一、题目要求…

【ES6】模块化

nodejs遵循了CommonJs的模块化规范 导入 require() 导出 module.exports 模块化的好处: 模块化可以避免命名冲突的问题大家都遵循同样的模块化写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用需要啥模块,调用就行 …

年底总结:野生码农与辉煌的2023

目录 始于兴趣终与坚持成于热爱2024 flag 始于兴趣 那是在遥远的2018年,我从机械行业跨入IT领域,当时觉得写代码非常酷的事,而且开发出来的功能可以提高机械制造效率,那种成就感油然而生。展望着未来,我觉得自己或许正…

8.【CPP】Vector(扩容问题||迭代器失效问题简述迭代器的种类)

vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自…

大数据Doris(六十五):基于Apache Doris的数据中台2.0

文章目录 基于Apache Doris的数据中台2.0 一、​​​​​​​架构升级

117.乐理基础-五线谱-音值组合法(二)

内容参考于:三分钟音乐社 上一个内容:116.乐理基础-五线谱-音值组合法(一)-CSDN博客 分母大于等于八的所有拍号的音值组合法,对于这些大于等于八的,可以用一句话来形容,那就是叫做&#xff0c…

骑砍战团MOD开发(44)-可编程渲染管线shader编程

一.可编程渲染管线 在GPU进行3D模型投射到2D平面过程中,渲染管线算法对开发者开放,目前支持的编程语言有OpenGL的ARB语言(pp文件),Direct3D的HLSL高级shader编程语言(fx文件). Direct3D提供一下API实现程序加载shader着色器文件: D3DXCreateEffectFromFile(gDevice,"fxfn…

使用 MinIO 超级充电 TileDB 引擎

MinIO 是一个强大的主要 TileDB 后端,因为两者都是为性能和规模而构建的。MinIO 是一个单一的 Go 二进制文件,可以在许多不同类型的云和本地环境中启动。它非常轻量级,但也具有复制和加密等功能,并且提供与各种应用程序的集成。Mi…

分享76个时间日期JS特效,总有一款适合您

分享76个时间日期JS特效,总有一款适合您 76个时间日期JS特效下载链接:https://pan.baidu.com/s/1s7tPGT_ItK7dNK5_qbZkug?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程, 面向过程就是一步一步去操作,你需要知道每一步的步骤。 面向对象的编程以对象为核心,通过定义类描述实体及其行为,并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

C++进阶(十四)智能指针

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、为什么需要智能指针?二、内存泄漏1、 什么是内存泄漏,内存泄漏的危…

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域,前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架,并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…

前端面试题——JS实现反转链式表

前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如,如果反转之前的单链表是0->1->2->3,那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的,即让每个节点的指…

【经验】PIC16F877A串口发送字符串问题

PIC16F877A串口发送,查询方式,就为了调出这个费了我一天时间,原来是串口芯片电压问题,现总结如下: 1、注意232串口芯片供电电压,有5V和3.3V的 2、注意TXD、RXD接线,单片机的TXD接232芯片的R2O…