Python设计模式中的结构型适配器模式
作者:范桂飓 发布时间:2023-07-19 11:59:54
标签:Python,设计,结构型,适配器,模式
一、适配器模式
适配器,顾名思义是一种万能的接口,达到万能转换的效果。
适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。
二、应用场景
三、代码示例
实体角色:
目标接口(Target):定义提供给 Client
访问的接口,可以是一个抽象类或接口,也可以是具体类。
待适配的类 / 适配者类(Adaptee):被适配的角色,它们已经存在了一些接口,是 Client 希望的业务方法,这些接口需要被适配。
适配器(Adapter):作为一个转换器,对 Adaptee
和 Target
进行适配。
方式一
import abc
class Mobile(metaclass=abc.ABCMeta):
@abc.abstractmethod
def call(self):
pass
class Xiaomi(Mobile):
# 目标接口
def call(self):
print(f"使用{self.__class__.__name__}打电话")
class Huawei(Mobile):
# 目标接口
def call(self):
print(f"使用{self.__class__.__name__}打电话")
# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Iphone:
def dial(self):
print(f"使用{self.__class__.__name__}打电话")
# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Chuizi:
def dial(self):
print(f"使用{self.__class__.__name__}打电话")
# 适配器,使得新的手机品牌打电话接口与旧的适配
class MobileAdapter(Mobile):
def __init__(self, mobile):
self.mobile = mobile
def call(self):
self.mobile.dial()
if __name__ == "__main__":
xiaomi = Xiaomi()
xiaomi.call()
huawei = Huawei()
huawei.call()
iphone = MobileAdapter(Iphone())
iphone.call()
chuizi = MobileAdapter(Chuizi())
chuizi.call()
方式二
适配器类通过__dict__
将需要转化的类的方法注册到适配器,重载 __getattr__
使其在适配器函数查无方法的时候,执行 getattr 方法。
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:
def __init__(self, classname, method):
self.classname = classname
self.__dict__update = method
def __getattr__(self, attr):
return getattr(self.classname, attr)
def test():
objects = []
AA = A()
objects.append(Adapter(AA, dict(test=AA.a)))
BB = B()
objects.append(Adapter(BB, dict(test=BB.b)))
CC = C()
objects.append(Adapter(CC, dict(test=CC.c)))
for obj in objects:
obj.test()
test()
来源:https://is-cloud.blog.csdn.net/article/details/122928395


猜你喜欢
- 1、什么是哈希hashhash一类算法,该算法接受传入的内容,经过运算得到一串hash值hash值的特点:只要传入的内容一样,得到的hash
- 一、安装selenium库问题1:什么是selenium模块?基于浏览器自动化的一个模块。 问题2:selenium模块有什么作用
- 游戏规则:一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。有以下几种牌:豹子:三张一样的牌,如3张6.顺金:又称同花顺,即3张
- Pycharm作为一款强力的Python IDE,在使用过程中感觉一直找不到全面完整的参考手册,因此决定对官网的Pycharm教程进行简要翻
- ClickHouse是近年来备受关注的开源列式数据库(DBMS),主要用于数据联机分析(OLAP)领域,于2016年开源。目前国内社区火热,
- 一、自定义数据集现有数据如下:5个文件夹,每个文件夹是神奇宝贝的一种。每个图片形状、大小、格式不一。我们训练CNN的时候需要的是tensor
- Dreamweaver从出道以来,其简便易用而又功能强大的“行为”(Behavior)一直是大家所关注的热点之一。在Dreamweaver
- pandas中有时需要按行依次对.csv文件读取内容,那么如何进行呢?我们来完整操作一遍,假设我们已经有了一个.csv文件。# 1.导入包i
- 1.元组的创建元组(tuple):元组本身是不可变数据类型,没有增删改查元组内可以存储任意数据类型t = (1,2.3,True,'
- 有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令。1、二者区
- PHP中的字符串操作功能是比较多的,重要的有以下这些: (1)echo,print,printf,spr
- 实例如下:# -*- coding: utf-8 -*-"""Spyder EditorThis tempor
- 新下载了一个Pycharm,建了个小demo,期间产生了一个sqlite3文件,由于是第一次打开,就弹出选择打开方式的对话框,手一块直接点了
- MyBatis 如何写配置文件和简单使用MyBatis3.x这里简单贴一下MyBatis的介绍,具体使用方法会在代码中贴出。MyBatis的
- IE6/7/8/9中Table/Select的innerHTML赋值会报错,如下 <!DOCTYPE HTML> <htm
- 首先下载源tar包可利用linux自带下载工具wget下载,如下所示:wget http://www.python.org/ftp/pyth
- 本来想着做一个将图片识别为文字的小功能,本想到Google上面第一页全是各种收费平台的广告。这些平台提供的基本都是让我们通过调用相关的三方接
- 起步Python 提供的多线程模型中并没有提供读写锁,读写锁相对于单纯的互斥锁,适用性更高,可以多个线程同时占用读模式的读写锁,但是只能一个
- 引言在前面的文章当中我们讨论的是 python3 当中早期的内嵌数据结构字典的实现,在本篇文章当中主要介绍在后续对于字典的内存优化。字典优化
- 1 什么是注释注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释