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
0
投稿
猜你喜欢
- 如何在SQL2000的查询中使用XML-Data?具体程序如下:orders.asp<%@ Language=VBScrip
- 如何修改被表单引用的ASP页面?formhandler.asp<HTML><BODY BGCOLOR="
- 近日,有关微软Open XML标准的问题又引发了某些业内人士的关注。其一是因为日前ISO(国际标准组织)成员南非和巴西相继就ISO批准微软的
- 对于使用虚拟主机的站长朋友,我们可能不知道该服务器是否安装了某种我们需要的组件。这时我们可以使用下面的代码来判断。该函数功能:检查是否存在系
- 1983年1月19日,苹果公司发布乔布斯领导研制的新一代电脑Lisa,当时Lisa电脑的设计人员就认为,必须将立即执行的命令和需要用户附加输
- PHP crypt() 函数定义和用法crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。在不同的操作系统
- 说到 IE 的 bug,一个臭名昭著的例子是它对于“盒模型”的错误解释:在 IE5.x 以及 Quirks 模式的 IE6/7 中,将 bo
- 我们在使用ASP 内置的ADO组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多
- 一、修改操作系统核心参数在Root用户下执行以下步骤:1)修改用户的SHELL的限制,修改/etc/security/limits.conf
- 图片轮播滤镜转换效果,只支持ie浏览器<img width="156" height="60"
- 在 .NET Framework 2.0中,ConfigurationManager类新增了两个属性AppSe
- PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(P
- 当数据库的数据量读写频繁的时候,我们就要考虑把数据库的读写分开,以提高数据库的使用效率,(当然还有其他用处比如,备份数据),这个时候我们就要
- 一、判断大型网站的标准1、pv(page views)网页的浏览量概念 一个网站所有的页面,在24小时内被访问的总的次数。千万级别,百万级别
- 我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_n
- [asp] 献一函数:ASP获取ACCESS数据库的表名以及表名对应的字段名和字段类型<%showtable "../dat
- opendir – 打开一个目录句柄,可用于之后的 closedir(),readdir() 和 rewinddir()
- 这最近在PJ的function库里看到的这个函数,感觉思路差了点,不过相对比较完美,只是闭合标签时的顺序问题,呵呵 修改一下数组arrTag
- 如何干预执行计划 - - 使用hints提示基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也
- 好久没有写ASP代码了,今天在做一个简单的留言本时,出现了一下错误: Microsoft Office Access Database En