• 内容:将一个类的接口转换为成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
    • 角色:
      • 目标接口(Target)
      • 待适合的类(Adaptee)
      • 适配器(Adapter)
    • 两种实现方法:
      • 类适配器:使用多继承
      • 对象适配器:使用组合

    image.png
    1、待适配类

    1. from abc import abstractmethod, ABCMeta
    2. class Payment(metaclass=ABCMeta):
    3. @abstractmethod
    4. def pay(self, money):
    5. raise NotImplemented
    6. class Alipay(Payment):
    7. def pay(self, money):
    8. print("支付宝支付%s元" % money)
    9. class ApplePay(Payment):
    10. def pay(self, money):
    11. print("苹果支付%s元"%money)
    12. # ----待适配类-----
    13. class WechatPay:
    14. def huaqian(self, money):
    15. print("微信支付%s元"%money)

    2、类适配器

    1. class RealWechatPay(payment, WechatPay):
    2. def pay(self, money):
    3. return self.huaqian(money)

    3、对象适配器

    1. class PayAdapter(PayMent):
    2. def __init__(self, payment):
    3. self.payment = payment
    4. def pay(self, money):
    5. return self.payment.huaqian(money)

    4、实现:

    1. # 类适配器
    2. RealWeChatPay().pay(100)
    3. # 对象适配器
    4. PayAdapter(WechatPay()).pay(1000)
    • 适用场景:
      • 想使用一个已经存在的类,而它的接口不符合你的要求。
      • (对象适配器) 想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。
    • 类适配器和对象适配器有不同的权衡:
      • 类适配器:
        • 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
        • 使得Adapter可以重Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
        • 仅仅引入一个对象,并不需要额外的指针以间接得到adaptee。
      • 对象适配器:
        • 允许一个Adapter与多个Adaptee———即Adaptee本身以及它的所有子类(如果有子类的话)—同时工作。Adapter也可以一次给所有的Adaptee添加功能。
        • 使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。