前言
适配器模式属于结构型模式,在日常生活中有各种充电器也可以成为电源适配器;
电源适配器可以把插座里面220V的电压转换成5V或者10V的电压给手机、电脑等电子设备充电。
一、适配器模式
结构型控制多个类组织成1中什么结构?几个类如何进行协同工作。
本来2个类本属于不同的系统,无法进行协同工作,此时就需要1个适配器类进行2者的转换。
1.概念
将原本不满足客户端预期的接口,转换成客户端期望的接口。
适配器使原本由于接口不兼容而不能一起工作的类可以一起工作。
2.角色
- 目标接口(Target)
- 待适配的类(Adaptee)
- 适配器(Adapter)
3.两种实现方式
在面向对象编程中 2个类之间需要复用代码有2种方式可以实现,分别为继承和组合。
- 类适配器:使用类多继承方法实现
- 对象适配器:使用类组合方式实现,组合就是在1个类中保存另1个类的对象。
4.应用场景
类适配器适用场景:想使用1个已经存在的类,而它的接口不符合你的要求;
对象适配器适用场景:想使用多个已经存在的类,但不可能每1个都进行子类化以匹配它们的接口。
5.代码
from abc import ABC, abstractmethod ''' 中国的支付系统有微信、支付宝两大支付系统,遵守中国的支付接口开发 美国的支付系统有PayPal支付系统,遵守美国的支付接口开发 如何让适配以上2种不同类型的支付系统 ''' # 中国的支付接口 class Payment(ABC): @abstractmethod def pay(self, money): pass # 阿里支付 class Alipay(Payment): def pay(self, money): print(f"支付宝支付{money}") # 微信支付 class WechatPay(Payment): def pay(self, money): print(f"微信支付--{money}") # 美国支付系统代码和以上2种中国支付系统的方法名称和参数都不一致 class PayPal(object): def cost(self, total_money, tax): print(f"贝宝支付--{total_money + tax}") class ApplePal(object): def cost(self, total_money, tax): print(f"苹果支付--{total_money + tax}") # 1.类适配器-适配PayPal支付系统代码和中国支付系统代码一样使用 # 缺陷:一旦新增了异类支付系统,就需要增加类适配器 class NewBankPay(Payment, PayPal): def pay(self, money): self.cost(total_money=money, tax=5) # 2.对象适配器-适配所有美国支付系统代码和中国支付系统代码一样使用 # 即遵守Payment接口也可以复用美国支付系统类的代码 class PaymentAddpter(Payment): def __init__(self, payment): self.payment = payment def pay(self, money): self.payment.cost(total_money=money, tax=5) if __name__ == '__main__': p = NewBankPay() p.pay(11) # 组合就是在A类中保存另B类的对象,这样做的目的就是可以在A类复用B类封装的代码 p1 = PaymentAddpter(ApplePal()) p1.pay(11)
参考