本文目录导读:

适配器模式主要解决接口不兼容的问题,具体到Python脚本场景,它帮助你让两个本来无法直接配合工作的类或系统协同运行,而无需修改它们的源代码。
核心问题
当你已有的代码(或第三方库)期望调用某个接口,但实际的对象提供了不同接口时,适配器模式就派上用场了。
三个典型场景
第三方库接口差异
# 假设你有一个使用"send_message"方法的系统
class NotificationSystem:
def notify(self, sender):
sender.send_message("Hello")
# 但新的第三方库使用不同的方法名
class ThirdPartyEmailService:
def send_email(self, content):
print(f"Sending email: {content}")
# 适配器解决这个差异
class EmailAdapter:
def __init__(self, service):
self.service = service
def send_message(self, content):
self.service.send_email(content)
遗留系统集成
当你需要将旧系统与新系统对接,但不愿或不能修改旧代码时:
# 旧系统
class LegacyLogger:
def write_log(self, severity, message):
print(f"[{severity}] {message}")
# 新系统期望的接口
class NewLogger:
def info(self, msg): pass
def error(self, msg): pass
def warn(self, msg): pass
# 适配器让旧系统适配新接口
class LegacyAdapter(NewLogger):
def __init__(self, legacy):
self.legacy = legacy
def info(self, msg):
self.legacy.write_log("INFO", msg)
def error(self, msg):
self.legacy.write_log("ERROR", msg)
数据格式转换
当不同模块使用不同数据结构时:
# 系统A期望的格式
class XMLProcessor:
def process(self, xml_data):
print(f"Processing XML: {xml_data}")
# 系统B产生JSON数据
class JSONDataSource:
def get_data(self):
return '{"name": "test", "value": 42}'
# 适配器转换格式
class JSONToXMLAdapter:
def __init__(self, json_source):
self.json_source = json_source
def get_xml_data(self):
import json
data = json.loads(self.json_source.get_data())
# 简单的XML转换
xml = f"<item><name>{data['name']}</name><value>{data['value']}</value></item>"
return xml
主要优势
- 无需修改现有代码 - 符合开闭原则
- 提高代码复用性 - 旧组件可以继续使用
- 解耦 - 调用方和被调用方不直接依赖
- 渐进式迁移 - 可以逐步替换旧系统
Python特别之处
Python的鸭子类型和动态特性让适配器实现更加灵活:
- 不需要严格的接口继承
- 可以使用
__getattr__实现更通用的转发 - 配合
functools可以创建函数适配器
简单说:遇到"对方的方法名/参数/返回值格式和我不匹配"时,适配器模式就是你最好的解决方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播