目录适配器模式应用场景代码示例
方式一方式二 适配器模式
适配器,顾名思义是一种万能的接口,达到万能转换的效果。
适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。
应用场景 代码示例实体角色:
目标接口(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()