0
点赞
收藏
分享

微信扫一扫

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


目录


文章目录


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

  • ​​方式一​​
  • ​​方式二​​



适配器模式

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

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

应用场景

代码示例

Python 设计模式 — 结构型模式 — 适配器模式_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()


举报

相关推荐

0 条评论