前言

适配器模式属于结构型模式,在日常生活中有各种充电器也可以成为电源适配器;

电源适配器可以把插座里面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)

 

 

 

 

 

参考

posted on 2024-02-03 20:22  Martin8866  阅读(9)  评论(0编辑  收藏  举报