欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Python设计模式—结构型模式—适配器模式

时间:2023-05-29
目录 文章目录

目录适配器模式应用场景代码示例

方式一方式二 适配器模式

适配器,顾名思义是一种万能的接口,达到万能转换的效果。

适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。

应用场景 代码示例

实体角色:

目标接口(Target):定义提供给 Client 访问的接口,可以是一个抽象类或接口,也可以是具体类。待适配的类 / 适配者类(Adaptee):被适配的角色,它们已经存在了一些接口,是 Client 希望的业务方法,这些接口需要被适配。适配器(Adapter):作为一个转换器,对 Adaptee 和 Target 进行适配。 方式一

import abcclass Mobile(metaclass=abc.ABCmeta): @abc.abstractmethod def call(self): passclass 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()

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。