Python中如何实现设计模式中的适配器模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计740个文字,预计阅读时间需要3分钟。
通过适配器模式,可以将一个类的接口转换成客户期望的另一个接口。这种模式使得原本因接口不兼容而不能一起工作的那些类可以一起工作。适配器模式适用于以下场景:
- 需要使用一个已经存在的类,但其接口不符合当前类的需求。- 想要创建一个可重用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容)协同工作。- 需要一个可插入式接口,用于动态地添加或更换功能。
更多信息请参考
适配器模式内容
将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
适配器模式实现方式
- 类适配器:使用多继承
- 对象适配器:使用组合
适配器模式中的角色
- 目标接口(Target)
- 待适配的类(Adaptee)
- 适配器(Adapter)
适配器模式使用场景
- 想使用一个已经存在的类,而它的接口不符合你的要求
- 想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口
适配器模式实例
(1)类适配器,即使用多继承的实例
from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
def pay(self,money):
print(f"pay {money} in alipay way...")
class WechatPay(Payment):
def pay(self,money):
print(f"pay {money} in wechat way...")
class BankPay(object):
def cost(self,money):
print(f"pay {money} in bankpay way...")
class NewBankPay(Payment,BankPay):
def pay(self,money):
self.cost(money)
if __name__=="__main__":
p=Alipay()
p.pay(100)
p2 = NewBankPay()
p2.pay(100)
执行结果如下:
pay 100 in alipay way...pay 100 in bankpay way...
(2)对象适配器,使用组合
from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
def pay(self,money):
print(f"pay {money} in alipay way...")
class WechatPay(Payment):
def pay(self,money):
print(f"pay {money} in wechat way...")
class BankPay(object):
def cost(self,money):
print(f"pay {money} in bankpay way...")
class PaymentAdapter(Payment):
def __init__(self,payment):
self.payment=payment
def pay(self,money):
self.payment.cost(money)
if __name__=="__main__":
p=Alipay()
p.pay(100)
p2 = PaymentAdapter(BankPay())
p2.pay(100)
执行结果如下:
pay 100 in alipay way...pay 100 in bankpay way...
本文共计740个文字,预计阅读时间需要3分钟。
通过适配器模式,可以将一个类的接口转换成客户期望的另一个接口。这种模式使得原本因接口不兼容而不能一起工作的那些类可以一起工作。适配器模式适用于以下场景:
- 需要使用一个已经存在的类,但其接口不符合当前类的需求。- 想要创建一个可重用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容)协同工作。- 需要一个可插入式接口,用于动态地添加或更换功能。
更多信息请参考
适配器模式内容
将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
适配器模式实现方式
- 类适配器:使用多继承
- 对象适配器:使用组合
适配器模式中的角色
- 目标接口(Target)
- 待适配的类(Adaptee)
- 适配器(Adapter)
适配器模式使用场景
- 想使用一个已经存在的类,而它的接口不符合你的要求
- 想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口
适配器模式实例
(1)类适配器,即使用多继承的实例
from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
def pay(self,money):
print(f"pay {money} in alipay way...")
class WechatPay(Payment):
def pay(self,money):
print(f"pay {money} in wechat way...")
class BankPay(object):
def cost(self,money):
print(f"pay {money} in bankpay way...")
class NewBankPay(Payment,BankPay):
def pay(self,money):
self.cost(money)
if __name__=="__main__":
p=Alipay()
p.pay(100)
p2 = NewBankPay()
p2.pay(100)
执行结果如下:
pay 100 in alipay way...pay 100 in bankpay way...
(2)对象适配器,使用组合
from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
def pay(self,money):
print(f"pay {money} in alipay way...")
class WechatPay(Payment):
def pay(self,money):
print(f"pay {money} in wechat way...")
class BankPay(object):
def cost(self,money):
print(f"pay {money} in bankpay way...")
class PaymentAdapter(Payment):
def __init__(self,payment):
self.payment=payment
def pay(self,money):
self.payment.cost(money)
if __name__=="__main__":
p=Alipay()
p.pay(100)
p2 = PaymentAdapter(BankPay())
p2.pay(100)
执行结果如下:
pay 100 in alipay way...pay 100 in bankpay way...

