新闻中心

如何使用Golang实现适配器模式_使用Adapter Pattern兼容不同接口

2025-12-12
浏览次数:
返回列表
适配器模式在Go中通过组合和接口嵌入实现,核心是让不兼容类型满足统一接口;定义目标接口Notifier和已有类型EmailSender/SMSSender,再创建EmailAdapter/SMSAdapter结构体桥接行为,最后统一调用Alert函数。

如何使用golang实现适配器模式_使用adapter pattern兼容不同接口

适配器模式的核心是让不兼容的接口能一起工作——Golang 没有继承,但通过组合和接口嵌入,实现起来更轻量、更清晰。

定义目标接口与已有类型

先明确你希望统一对外暴露的接口(Target),再确认已有类型(Adaptee)的行为。比如:

  • 目标接口:Notifier 要求有 Send(message string) 方法;
  • 已有类型:EmailSenderSendEmail(to, body string)SMSSenderSendSMS(phone, text string) —— 它们无法直接满足 Notifier

编写适配器结构体,组合并桥接行为

适配器不是改造原有类型,而是新建一个结构体,内嵌或持有 Adaptee,并实现 Target 接口:

type EmailAdapter struct {
    emailSender *EmailSender
}

func (e *EmailAdapter) Send(message string) {
    e.emailSender.SendEmail("admin@example.com", message)
}

type SMSAdapter struct {
    smsSender *SMSSender
}

func (s *SMSAdapter) Send(message string) {
    s.smsSender.SendSMS("13800138000", message)
}

注意:适配器只负责“翻译”调用,不改变原逻辑。参数映射、默认值填充、错误转换等都在这里处理。

统一使用,隐藏底层差异

现在你可以把不同适配器当成同一类型传入业务逻辑:

微软爱写作 微软爱写作

微软出品的免费英文写作/辅助/批改/评分工具

微软爱写作 130 查看详情 微软爱写作
func Alert(n Notifier, msg string) {
    n.Send(msg) // 不关心背后是邮件还是短信
}

Alert(&EmailAdapter{&EmailSender{}}, "服务器宕机!")
Alert(&SMSAdapter{&SMSSender{}}, "服务器宕机!")

新增渠道(如 DingTalk、Webhook)只需写新适配器,不修改 Alert 或其他依赖 Notifier 的代码。

进阶:用函数适配器简化简单场景

如果 Adaptee 是简单函数,可直接用闭包构造适配器,避免定义结构体:

func NewHTTPNotifier(client *http.Client, url string) Notifier {
    return Notifier(func(msg string) {
        http.Post(url, "text/plain", strings.NewReader(msg))
    })
}

这种函数式适配器适合轻量集成,代码更紧凑,也符合 Go 的务实风格。

基本上就这些。Go 的适配器不靠继承靠组合,不靠抽象类靠接口,写起来干净,维护时也容易替换——关键在于分清谁是契约(接口)、谁是实现(具体类型)、谁是胶水(适配器)。

以上就是如何使用Golang实现适配器模式_使用Adapter Pattern兼容不同接口的详细内容,更多请关注其它相关文章!


# 桥接  # 纳溪区推广营销招聘网址  # 泰安视频矩阵营销推广公司  # 外贸网站建设 广州  # 遂宁seo优化负责  # 网站建设解析  # SEO优帮云  # seo公司是正规的吗  # SEO工作室改造卧室  # seo推广服务推荐  # 银川网络公司seo  # 见性  # go  # 大文件  # 进阶  # 不兼容  # 转换为  # 谁是  # 如何使用  # 已有  # 微软  # talk  # ai  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  小米14应用无法联网原因分析_小米14网络权限修复  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  Discord Slash 命令响应超时问题的异步解决方案  使用Pandas转换并合并DataFrame:多列映射至统一结构  Go语言中的*string:深入理解字符串指针  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  深入理解Go语言中的指针类型:以*string为例  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  顺丰国际快递查询 国际件官方查询入口  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  快手网页版在线登录 快手网页版官网入口快速访问  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  58动漫网在线官方网 58动漫网正版动漫入口网址  Python实时数据流中的动态最值查找策略  4399体育竞技小游戏_4399小游戏赛事入口  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  如何在CSS中使用浮动制作导航栏_float实现水平菜单  大麦的“候补”是什么意思 大麦候补购票规则【详解】  高德地图怎么看全景照片_高德地图全景照片浏览教程  c++ 命名空间怎么用 c++ namespace使用指南  css链接悬停下划线样式如何自定义_使用::after结合content和transition  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  提升Kafka消费者健壮性:会话超时处理与消息处理语义  Centos/Linux 系统下安装 composer 的完整步骤  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  Python异步编程实践:使用Binance API构建实时交易数据流  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  J*aScript实现单选按钮与关联输入框的联动禁用教程 

搜索