结构型设计模式-适配器(adapter)模式-python实现

2024-08-29 14:44

本文主要是介绍结构型设计模式-适配器(adapter)模式-python实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计模式汇总:查看

通俗示例

想象一下,你刚从国外带回一台最新的笔记本电脑,但是你发现它的电源插头是德标插头,而家里的电源插座是中式插座,这时怎么办呢?你需要一个电源适配器来将德标插头转换成中式插座,这样你的电脑才能正常充电。在软件设计中,适配器模式就扮演着类似的角色,它允许不兼容的接口一起工作。

通俗解释

适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它允许一个类的接口转换成客户期望的另一个接口,使得原本因为接口不兼容而不能一起工作的那些类可以一起工作。

在适配器模式中,通常有三种角色:

  1. 目标接口(Target):当前系统期望使用的接口。
  2. 被适配者(Adaptee):一个已存在的接口,但其接口与目标接口不兼容。
  3. 适配器(Adapter):一个转换器,它实现了目标接口,并通过私有方式包含被适配者的实例,适配器的目的是转换接口,使客户可以通过目标接口与被适配者交互。

适配器模式的两种类型

  1. 对象适配器:在这种适配器模式中,适配器通过组合的方式引入被适配者的实例,而不是通过继承。
  2. 类适配器:在这种适配器模式中,适配器通过继承被适配者类以及实现目标接口的方式来实现适配。

Python代码示例 - 对象适配器

下面是一个对象适配器的简单实现:

class A:def a(self):print("我是A类的a方法")class B:def b(self):print("我是B类的b方法")class C:def c(self):print("我是C类的c方法")class Adapter(object):"""适配器类,用于将一个对象的接口转换为另一个接口。这使得原本不兼容的类能够协同工作。参数:- instance: 需要被适配的对象。- method: 一个字典,包含需要被适配的方法名和方法对象。"""def __init__(self, instance, method):"""初始化适配器对象。参数:- instance: 需要被适配的对象。- method: 一个字典,包含需要被适配的方法名和方法对象。"""self.instance = instance# 通过更新实例的__dict__来添加新的方法,实现接口的适配self.__dict__.update(method)def __getattr__(self, attr):"""当尝试访问适配器对象上不存在的属性时,自动转发访问请求到被适配的对象上。参数:- attr: 需要访问的属性名。返回:- 被适配对象上相应属性的值。"""# 如果适配器对象本身没有定义该属性,则从被适配对象上获取return getattr(self.instance, attr)if __name__ == '__main__':# 初始化一个空列表,用于存储适配器对象objects = []# 创建A类的实例AA,并使用Adapter将其包装# Adapter的作用是将不同类的对象转换为统一的接口,这里将AA的属性a暴露为test方法AA = A()objects.append(Adapter(AA, dict(test=AA.a)))# 创建B类的实例BB,并使用Adapter将其包装# 这里同样将BB的属性b暴露为test方法,实现了与AA对象的接口统一BB = B()objects.append(Adapter(BB, dict(test=BB.b)))# 创建C类的实例CC,并使用Adapter将其包装# C类的属性c也被转换为test方法,确保所有对象都可以通过相同的接口调用CC = C()objects.append(Adapter(CC, dict(test=CC.c)))# 遍历对象列表,打印每个适配器对象的属性和调用test方法# 这里展示了适配器模式的应用,允许不同类的对象以统一的方式交互for obj in objects:print('>>> 11')print(dir(obj))obj.test()

总结

适配器模式是一种非常有用的设计模式,它可以让不兼容的接口协同工作,提高了代码的复用性和系统的灵活性。当你面临接口不兼容的问题,或者你想在不修改现有代码的前提下引入新功能时,适配器模式就是一个很好的选择。
在这里插入图片描述

这篇关于结构型设计模式-适配器(adapter)模式-python实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118159

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码