一、模式定义与核心思想
适配器模式(Adapter Pattern) 是一种结构型设计模式,它通过创建一个中间层(适配器),将不兼容的接口转换为客户端期望的接口。就像现实中的电源适配器,让不同国家的插头都能在同一个插座上工作。
二、模式结构解析
# 目标接口:客户端期望的接口
class Target:
def request(self):
"""标准请求方法"""
raise NotImplementedError
# 被适配者:已有的不兼容实现
class Adaptee:
def specific_request(self):
"""特殊请求方法,与目标接口不兼容"""
return "特殊请求结果"
# 适配器:核心转换逻辑
class Adapter(Target):
def __init__(self, adaptee):
self.adaptee = adaptee # 持有被适配对象的引用
def request(self):
"""将标准请求转换为特殊请求"""
return f"适配器转换: {self.adaptee.specific_request()}"
三、实际应用场景演示
场景:集成旧版日志系统
# 旧日志系统(不兼容的被适配者)
class LegacyLogger:
def log_to_file(self, message):
"""仅支持文件日志"""
with open("app.log", "a") as f:
f.write(f"[FILE] {message}\n")
# 新日志接口规范
class NewLogger(Target):
def log(self, level, message):
"""标准日志接口"""
raise NotImplementedError
# 日志适配器实现
class LoggerAdapter(NewLogger):
def __init__(self, legacy_logger):
self.legacy_logger = legacy_logger
def log(self, level, message):
"""将新接口转换为旧接口调用"""
formatted_msg = f"[{level.upper()}] {message}"
self.legacy_logger.log_to_file(formatted_msg)
# 客户端使用
if __name__ == "__main__":
legacy = LegacyLogger()
adapter = LoggerAdapter(legacy)
# 客户端调用新接口
adapter.log("error", "系统崩溃了!") # 实际调用旧日志系统
四、模式变体与实现方式
1. 类适配器(通过多重继承)
class ClassAdapter(Target, Adaptee):
def request(self):
"""直接继承被适配者并实现目标接口"""
return f"类适配器转换: {self.specific_request()}"
2. 对象适配器(通过组合)
class ObjectAdapter(Target):
def __init__(self, adaptee):
self.adaptee = adaptee # 组合方式持有被适配对象
def request(self):
return f"对象适配器转换: {self.adaptee.specific_request()}"
五、应用场景深度解析
系统集成:整合老旧系统与新架构
- 银行系统集成不同时期的交易模块
- 电商系统对接多个物流供应商API
第三方库适配:统一不同库的接口
# 不同支付网关适配示例 class PaymentAdapter(Target): def __init__(self, payment_gateway): self.gateway = payment_gateway def request(self): if "Alipay" in str(type(self.gateway)): return self._alipay_adapter() elif "WeChat" in str(type(self.gateway)): return self._wechat_adapter() def _alipay_adapter(self): # 转换支付宝接口 pass def _wechat_adapter(self): # 转换微信支付接口 pass
接口标准化:统一不同硬件设备的控制接口
- 智能家居系统中控制不同品牌的智能设备
六、模式优缺点分析
优点 | 缺点 |
---|---|
✅ 符合开闭原则(扩展开放,修改关闭) | ❌ 增加系统复杂度 |
✅ 提高类复用性 | ❌ 过多适配器可能影响性能 |
✅ 灵活替换实现方案 |
七、最佳实践建议
- 明确适配边界:只为真正不兼容的接口创建适配器
- 保持适配器精简:避免在适配器中添加业务逻辑
- 命名规范:建议使用
XxxAdapter
的命名方式 - 文档说明:明确标注适配关系和转换逻辑
八、模式对比
模式 | 核心目的 | 适用场景 |
---|---|---|
适配器模式 | 接口转换 | 接口不兼容但功能相似 |
装饰器模式 | 动态扩展功能 | 需要透明地添加多个功能 |
外观模式 | 简化复杂子系统接口 | 提供统一入口的复杂系统 |
九、总结
适配器模式是解决接口兼容性问题的利器,通过创建中间层实现无缝集成。在Python这种动态语言中,可以更灵活地使用__getattr__
等魔法方法实现动态适配。使用时需权衡代码复杂度与实际需求,避免过度设计。
附:完整代码示例可在GitHub仓库查看,包含单元测试和更多实现变体。