Python与设计模式之适配器的使用方法

适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

主要有两个实现方式:

1.使用继承--类适配器

2.使用组合--对象适配器

适用场景

1.想使用一个已经存在的类,而它的接口不符合你的要求

2.想使用一些已经存在的子类,但不可能对每一个都进行子类以匹配它们的接口,适配器可以匹配他们的父类接口。

#系统A的支付类抽象方法
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def 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 = payment
    def pay(self,money):#实际父类抽象方法
        self.payment.cost(money)

p=PaymentAdapter(ApplePay())
p.pay(100)
------------------------------
苹果支付了100元

这样就实现在通过继承父类的方式,然后传入子类实际,实现调用子类的方法。对外依旧是封装了pay()方法。这样就实现了需要什么支付方式,就只需要传入子类的实例就行了。

-------------------------------------------------------

每天进步一点点,理解加深一点点。

相关推荐

  1. Python设计模式适配器使用方法

    2024-04-21 19:40:01       31 阅读
  2. 设计模式-适配器模式

    2024-04-21 19:40:01       59 阅读
  3. 设计模式适配器模式

    2024-04-21 19:40:01       43 阅读
  4. 设计模式适配器模式

    2024-04-21 19:40:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 19:40:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 19:40:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 19:40:01       82 阅读
  4. Python语言-面向对象

    2024-04-21 19:40:01       91 阅读

热门阅读

  1. 三七互娱,oppo,快手25届暑期实习内推

    2024-04-21 19:40:01       36 阅读
  2. SQLSERVER对等发布问题处理

    2024-04-21 19:40:01       38 阅读
  3. 工作中常用到的一些sql脚本

    2024-04-21 19:40:01       32 阅读
  4. 【QT教程】QML音视频效果实现

    2024-04-21 19:40:01       31 阅读
  5. Debian

    Debian

    2024-04-21 19:40:01      32 阅读
  6. ARM Day7

    2024-04-21 19:40:01       37 阅读
  7. Linux-System V共享内存

    2024-04-21 19:40:01       41 阅读
  8. Stable Diffusion 本地部署教程

    2024-04-21 19:40:01       31 阅读
  9. Solidity基础面试题

    2024-04-21 19:40:01       28 阅读
  10. Scala之List

    2024-04-21 19:40:01       32 阅读