适配器模式(Adapter Pattern)详解
接口不兼容?加一层适配器,不改业务代码。含与策略/观察者/工厂模式的对比。
DAY02b — 适配器模式(Adapter Pattern)
相关笔记:[[DAY02-观察者模式]] | [[DAY01c-策略模式]] 相关索引:[[索引-设计模式]] | [[索引-Python]]
一句话
接口不兼容?加一层适配器,不改业务代码。
什么时候需要
你的代码: OldPayment.pay(order_id, amount) ← 10 处调用
第三方新库:NewPayment.process(txn_id, money) ← 接口不一样
不改 10 处,只写 1 个适配器:
NewPaymentAdapter.pay(order_id, amount) {
内部调用 NewPayment.process(...)
}
适配器做了什么
业务代码 (OrderService)
│ 只认识 pay(order_id, amount)
▼
适配器 (NewPaymentAdapter)
│ 把 pay → 翻译成 process
▼
第三方库 (NewPayment.process(txn_id, money))
和之前模式的区别
| 模式 | 解决什么问题 |
|---|---|
| 策略模式 | 多个算法选一个 |
| 观察者模式 | 做完 A 通知 B、C、D |
| 工厂模式 | 对象创建统一管理 |
| 适配器模式 | 接口不兼容,加一层翻译 |
额外收获:依赖注入
适配器模式通常和依赖注入一起用:
# bad:业务代码自己 new 支付
class OrderService:
def checkout(self, ...):
payment = OldPayment() # 耦合死了
# good:支付从外面传进来
class OrderService:
def __init__(self, payment: PaymentGateway):
self._payment = payment # 解耦!
好处:测试时可以传 FakePayment,不用真付钱。
代码文件
Day01.code/adapter_exercise.py— 有问题的代码Day01.code/adapter_pattern.py— 适配器模式改造版
当前进度
阶段一:■■■■□□□□□□ 4/10 ✅ 适配器模式