适配器模式的核心作用是让原本因接口不匹配而无法一起工作的类能够协同工作,它主要通过包装原有类来实现新接口。

适配器模式的核心组成

  1. 目标接口(Target):客户期望使用的接口,定义了客户需要的功能规范。
  2. 适配者(Adaptee):已存在的、接口不符合目标要求的类或对象,是需要被 “翻译” 的对象。
  3. 适配器(Adapter):实现目标接口,并包装一个适配者对象,通过调用适配者的方法来满足目标接口的需求。
# 1. 目标接口(新系统要求的统一接口)
class Payment:
    def pay(self, amount):
        """新系统要求的支付接口:接收金额,返回支付结果"""
        raise NotImplementedError("必须实现 pay 方法")


# 2. 新的支付方式(天然符合目标接口,无需适配)
class Alipay(Payment):
    def pay(self, amount):
        return f"支付宝支付 {amount} 元成功"


class WechatPay(Payment):
    def pay(self, amount):
        return f"微信支付 {amount} 元成功"


# 3. 适配者(旧系统的现金支付,接口不兼容)
class OldCashPayment:
    def cash_pay(self):
        """旧系统的现金支付接口:无参数,固定返回结果"""
        return "现金支付成功(旧系统)"


# 4. 适配器(让旧现金支付适配新接口)
class CashAdapter(Payment):
    def __init__(self, old_cash):
        self.old_cash = old_cash  # 持有旧支付对象

    def pay(self, amount):
        # 调用旧接口,同时兼容新接口的金额参数(这里可以记录金额,不影响旧逻辑)
        old_result = self.old_cash.cash_pay()
        return f"{old_result},记录金额:{amount} 元"  # 适配时补充金额信息


# 客户端代码(只依赖目标接口 Payment,完全不关心具体是新支付还是适配后的旧支付)
def process_payment(payment: Payment, amount):
    # 客户端只调用 new 接口 pay(amount)
    result = payment.pay(amount)
    print(f"支付结果:{result}")


# 测试:客户端统一调用新接口,处理各种支付方式
if __name__ == "__main__":
    # 新支付方式(直接符合接口)
    alipay = Alipay()
    wechat = WechatPay()
    
    # 旧支付方式(通过适配器适配新接口)
    old_cash = OldCashPayment()
    cash_adapter = CashAdapter(old_cash)
    
    # 客户端用同一个方法处理所有支付,完全不区分新旧
    process_payment(alipay, 100)    # 支付宝支付 100 元
    process_payment(wechat, 200)    # 微信支付 200 元
    process_payment(cash_adapter, 300)  # 适配后的现金支付 300 元
  • 新接口的 pay(amount) 强制要求传入金额参数,因此能明确知道 “支付了多少”,这对现代系统的记账、对账、统计等功能至关重要。
  • 旧系统的 cash_pay() 没有参数,只能返回 “支付成功”,无法体现金额,这在需要精细化管理的新系统中是不够的。

适配器(CashAdapter)的作用就是在不修改旧系统代码的前提下,将新接口的金额参数 “附加” 到旧系统的结果中(比如例子中 “记录金额:300 元”),让旧系统在新接口中也能支持 “追踪金额” 的能力,从而被新系统兼容。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐