Golang学习笔记_32——适配器模式

Golang学习笔记_29------抽象工厂模式
Golang学习笔记_30------建造者模式
Golang学习笔记_31------原型模式


文章目录


一、核心概念

定义:将一个类的接口转换成客户端期望的另一个接口,使原本因接口不兼容而无法协同工作的类能一起工作。

核心比喻:类似于电源插头转换器,让美标插头能在欧标插座上使用。

双重角色

  1. 接口转换器:解决新旧组件接口不兼容问题
  2. 包装器:通过包装已有对象提供新接口

二、模式结构

plantuml 复制代码
@startuml
class Target {
    +Request()
}

class Adaptee {
    +SpecificRequest()
}

class Adapter {
    -adaptee: Adaptee
    +Request()
}

Target <|-- Adapter
Adapter o-- Adaptee

note right of Adaptee: 需要被适配的现有类
note left of Target: 客户端期望的接口
@enduml

三、模式特点

优点

  1. 兼容性:解决接口不兼容问题,提高系统扩展性
  2. 复用性:无需修改现有代码即可复用遗留系统
  3. 透明性:对客户端隐藏适配过程
  4. 开闭原则:通过新增适配器类实现扩展,而非修改已有代码

缺点

  1. 复杂度增加:过多适配器会降低代码可读性
  2. 性能损耗:多层包装可能带来调用链增长(通常可忽略)
  3. 设计妥协:可能掩盖接口设计不合理的问题

四、实现方式对比

类型 类适配器 对象适配器
实现方式 多重继承(Go不支持) 组合
灵活性 适配特定类 适配类及其子类
代码侵入性 需要修改适配器继承关系 无侵入
Go适用性 不可用 推荐方式

五、适用场景

  1. 系统整合:对接第三方库/服务时接口不匹配
  2. 版本升级:新旧系统兼容过渡
  3. 接口标准化:统一多个相似功能但接口不同的组件
  4. 跨平台开发:不同平台API的适配封装
  5. 测试驱动:创建测试替身(Test Double)

六、与其他模式的对比

1. 与装饰器模式
  • 相同:都使用包装技术
  • 差异
    • 适配器:改变被包装对象的接口
    • 装饰器:增强接口功能,不改变接口
2. 与外观模式
  • 相同:都是包装已有对象
  • 差异
    • 适配器:解决单个组件的接口转换
    • 外观:简化复杂子系统的接口
3. 与创建型模式(工厂/原型)
  • 关注点
    • 适配器:接口转换(结构型模式)
    • 创建型模式:对象创建机制
  • 协同使用:常与抽象工厂结合,创建适配器实例

七、Go实现示例

go 复制代码
package adapter_demo

import (
  "fmt"
)

// 旧接口
type OldLogger interface {
  oldLogInfo(message string, level string)
}

// 目标接口(新日志)
type Target interface {
  newLogInfo(message string)
}

// 源接口(旧日志)
type oldLogger struct {
  Message string
  Level   string
}

func (ol *oldLogger) oldLogInfo(message string, level string) {
  fmt.Println("old Logger: " + message)
  fmt.Println("old Logger: " + level)
}

func (l *oldLogger) newLogInfo(message string) {
  fmt.Println("new Logger: " + message)
  fmt.Println("new Logger: " + l.Level)
}

// 适配器
type LoggerAdapter struct {
  legacyLogger *oldLogger
}

func (la *LoggerAdapter) newLogInfo(message string) {
  la.legacyLogger.newLogInfo(message)
}

func test() {
  newLogger := &LoggerAdapter{
    legacyLogger: &oldLogger{
      Message: "",
      Level:   "INFO",
    },
  }
  newLogger.newLogInfo("Hello, World!")
  oldLogger := &oldLogger{}
  oldLogger.oldLogInfo("Hello, World!", "INFO")
}

输出结果

复制代码
=== RUN   Test_test
new Logger: Hello, World!
new Logger: INFO
old Logger: Hello, World!
old Logger: INFO
--- PASS: Test_test (0.00s)
PASS

八、最佳实践建议

  1. 优先使用组合:Go推荐对象适配器实现
  2. 接口最小化:保持目标接口简洁
  3. 双向适配:需要时实现双向接口转换
  4. 适配器注册:结合工厂模式管理适配器实例
  5. 性能监控:关键路径注意多层适配带来的性能影响

通过适配器模式,我们能在保持系统架构整洁的同时,有效整合新旧组件,是应对系统演进和第三方集成的利器。实际应用中需权衡使用场景,避免过度设计。

相关推荐
千寻xun4 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
researcher-Jiang4 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
似是燕归来5 小时前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发
MartinYeung59 小时前
[论文学习]大语言模型安全综述:攻击、防御、对齐、度量与护栏的深度解析
学习·安全·语言模型
Piko6149 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
AOwhisky10 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
心中有国也有家10 小时前
AtomGit Flutter 鸿蒙客户端:白噪音场景的视觉设计
学习·flutter·华为·harmonyos
心中有国也有家10 小时前
AtomGit Flutter 鸿蒙客户端:呼吸练习的完整生命周期
学习·flutter·华为·harmonyos
Zeeland10 小时前
构建护城河:自学习 Agent
学习
尼米棕熊10 小时前
大模型学习8上-推理部署框架llama.cpp与Ollama使用指北
学习·llama