当前位置: 首页 > news >正文

Python设计模式 - 适配器模式

定义

适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换为客户端所期待的另一个接口。
注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。

结构

适配器模式可分为对象适配器模式和类适配器模式两种。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承关系。

对象适配器模式:
在这里插入图片描述

类适配器模式:
在这里插入图片描述

  • 目标抽象类(Target): 客户端希望使用的抽象类。
  • 适配者类(Adaptee): 需要适配的具体类。
  • 适配器类(Adapter): 作为一个转换器,对Adaptee和Target进行适配。

应用场景

  1. 复用现有代码:当你有现有的第三方库或遗留代码,这些代码与新的系统接口不兼容时,使用适配器模式可以使它们能够共同工作,而无需修改现有的代码。例如,旧的数据库访问类或旧的消息队列系统,通过适配器模式将它们与新的系统进行兼容。
  2. 多种外部系统对接:在系统需要与多个外部系统进行对接时,不同的外部系统可能会有不同的接口和协议。适配器模式可以帮助将这些不同的接口转换为统一的接口,从而简化集成工作。比如,可以将不同支付网关(如支付宝、微信支付、PayPal等)整合到统一的支付接口中,或将不同操作系统上的图像处理库通过适配器封装为统一接口。
  3. 当系统或接口升级时,新接口可能与旧系统不兼容。适配器模式可以将新接口转换为旧接口的形式,确保旧系统正常运行,无需大规模修改代码。例如,第三方API更新时,适配器可以将新接口转化为旧的调用方式,从而保持兼容性。

优缺点

优点:

  1. 解耦:适配器模式使得客户端和具体的实现类解耦。客户端只与适配器交互,而不直接依赖于具体的类实现,这样客户端无需关心具体实现的细节。
  2. 代码复用性高:通过使用适配器,可以将旧的或第三方的代码与新的系统无缝对接,避免重复开发。
  3. 易于扩展:通过引入新的适配器类,可以快速支持新的接口或协议,而不需要修改现有的代码。

缺点:

  1. 增加系统复杂性:适配器模式通过引入额外的适配器类来实现接口转换,这会使系统的结构更加复杂。在需要多个适配器时,会增加类的数量和相互关系,特别是当适配器层次过多时,可能会导致系统的维护变得更加困难。

代码示例

对象适配器模式

# 目标抽象类
class Payment:
    def pay(self, amount):
        pass


# 支付宝支付类
class Alipay:
    def alipay_payment(self, amount):
        print(f"支付{amount}元,通过支付宝完成支付。")


# 微信支付类
class WeChatPay:
    def wechat_payment(self, amount):
        print(f"支付{amount}元,通过微信支付完成支付。")


# 支付宝适配器类
class AlipayAdapter(Payment):
    def __init__(self):
        self.alipay = Alipay()

    def pay(self, amount):
        self.alipay.alipay_payment(amount)


# 微信支付适配器类
class WeChatPayAdapter(Payment):
    def __init__(self):
        self.wechat_pay = WeChatPay()

    def pay(self, amount):
        self.wechat_pay.wechat_payment(amount)


# 客户端通过适配器来选择支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()

alipay_adapter.pay(100)  # 支付100元,通过支付宝
wechat_adapter.pay(200)  # 支付200元,通过微信支付

类适配器模式

# 支付宝适配器类(类适配器)
class AlipayAdapter(Alipay, Payment):
    def pay(self, amount):
        # 调用Alipay类的支付方法
        self.alipay_payment(amount)


# 微信支付适配器类(类适配器)
class WeChatPayAdapter(WeChatPay, Payment):
    def pay(self, amount):
        # 调用WeChatPay类的支付方法
        self.wechat_payment(amount)


# 客户端通过适配器来选择支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()

alipay_adapter.pay(100)  # 支付100元,通过支付宝
wechat_adapter.pay(200)  # 支付200元,通过微信支付

对象适配器模式和类适配器模式的比较

  1. 在类适配器模式中,由于适配器类是适配者类的子类,因此可以在适配器类中重写一些适配者的方法,使得适配器的灵活性更强。而在对象适配器模式中,适配器通过组合适配者类实现功能,要修改适配者的方法则需要通过委托和包装,操作上相对复杂。
  2. 在对象适配器模式中,一个对象适配器可以把多个不同的适配者适配到同一个目标。而在类适配器模式中,虽然可以通过继承多个适配者来实现,但这样会使类结构变得更加复杂,难以维护。
  3. 对象适配器模式 更适合需要高灵活性、能够适配多个不同对象或者无需修改适配者的场景。类适配器模式 适用于适配单一适配者并且对性能和实现简单性有较高要求的场景。

参考

《设计模式的艺术》

相关文章:

  • 二十四、实战开发 uni-app x 项目(仿京东)- 前后端实现登录注册
  • 在线生成自定义二维码
  • 失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的异常处理:全局异常与自定义异常
  • 【自学笔记】Linux基础知识点总览-持续更新
  • 利用Dify编制用户问题意图识别和规范化回复
  • C#单例模式
  • 常考计算机操作系统面试习题(二)(中)
  • Windows——电脑无法正常上网的一种解决办法
  • 统计学重要概念:自由度
  • 《Python实战进阶》第43集:使用 asyncio 实现异步编程
  • Amdahl 定律
  • react 中 key 的使用
  • 抗积分饱和(Anti-Windup)常见的处理方法
  • SpringBoot原理篇-SpringBoot配置优先级-Bean管理-起步依赖原理-自动配置两种方案-源码跟踪-自定义starter
  • 不同的CMS系统开源许可证对二次开发有哪些具体的限制?
  • 运维面试题(七)
  • 【矩阵快速幂】 P10502 Matrix Power Series|省选-
  • 蓝桥杯 之 最短路径算法
  • Bulk Rename Utility(BRU)——大批量重命名实用程序
  • 美国警方:爱达荷州交通事故致7人死亡,8名伤者预计无生命危险
  • 出现这几个症状,说明你真的老了
  • 海外考古大家访谈|斯文特·帕波:人类进化遗传学的奠基者
  • 安徽两位新任地级市政府党组书记亮相
  • 五一首日出沪高峰,G1503高东收费站上午车速约30公里/小时
  • 同日哑火丢冠,双骄的下山路,手牵手一起走