适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
主要有两个实现方式:
1.使用继承--类适配器
2.使用组合--对象适配器
适用场景
1.想使用一个已经存在的类,而它的接口不符合你的要求
2.想使用一些已经存在的子类,但不可能对每一个都进行子类以匹配它们的接口,适配器可以匹配他们的父类接口。
#系统A的支付类抽象方法
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self,money):pass
#系统A的两个支付方式,AliPay,WechatPay.
class AliPay(Payment):def pay(self,money):print(f'支付宝支付了{money}元 ')class WechatPay(Payment):def pay(self,money):print(f'微信支付了{money}元')#系统B的支付方式 BankPay,ApplePay
class BankPay():def cost(self,money):print(f'银联支付了{money}元')
class ApplePay():def cost(self,money):print(f'苹果支付了{money}元')
一、使用继承
现在系统A要合并系统B,并统一对外提供接口,使得原来的接口不变
则新增一个系统A规划的类,同时继承Payment与BankPay,
class NewBankPay(Payment,BankPay):def pay(self,money):self.cost.pay(money)#client调用只由原来的BankPay()改为适配好的NewBankPay()p=NewBankPay()
p.pay(100) #这个则是去调用继续过来的父类BankPay的cost。这对外就统一了pay()方法。
二、使用组合方式
何为组合,简单提一下,就是有A类,B类,然后在B类的属性里加入A的对象。里调用 A类的实例对象。
#使用实例调用适配器,方法是继承父类,然后传入子类实例,来实现调用子类的方法
class PaymentAdater(Payment):def __init__(self,payment):#初始化把实例赋值给对象self.payment = paymentdef pay(self,money):#实际父类抽象方法self.payment.cost(money)p=PaymentAdapter(ApplePay())
p.pay(100)
------------------------------
苹果支付了100元
这样就实现在通过继承父类的方式,然后传入子类实际,实现调用子类的方法。对外依旧是封装了pay()方法。这样就实现了需要什么支付方式,就只需要传入子类的实例就行了。
-------------------------------------------------------
每天进步一点点,理解加深一点点。