设计模式之适配器模式(一)

设计模式之适配器模式(一)

适配器模式实现方式

类适配器:使用多继承

对象适配器:使用组合

适配器模式中的角色

目标接口(Target)

待适配的类(Adaptee)

适配器(Adapter)

适配器模式使用场景

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

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

适配器模式实例

(1) 类适配器,即使用多继承的实例
bash 复制代码
from abc import ABCMeta,abstractmethod

class 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) 对象适配器,使用组合
bash 复制代码
from abc import ABCMeta,abstractmethod

class 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...

相关推荐
--fancy2 小时前
股票预测情感分析研究案例分析
python
shughui2 小时前
PyCharm 完整教程(旧版本卸载+旧/新版本下载安装+基础使用,2026最新版附安装包)
ide·python·pycharm
小糖学代码2 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
yejqvow123 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
m0_743623923 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele3 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python
HHHHH1010HHHHH3 小时前
Redis怎样判断节点是否主观下线_哨兵基于down-after-milliseconds参数的心跳超时判定
jvm·数据库·python
小白学大数据3 小时前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
qq_654366983 小时前
CSS如何处理@import样式表的嵌套加载_评估递归对加载的影响
jvm·数据库·python
weixin_381288183 小时前
苹果微软双修党福音:Navicat如何跨系统平滑迁移配置
jvm·数据库·python