信息发布→ 登录 注册 退出

如何使用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兼容不同接口的详细内容,更多请关注其它相关文章!


相关文章: 快手网页版在线登录 快手网页版官网入口快速访问  新手怎么开始学化妆 零基础化妆入门教程  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  mcjs网页版在线存档 mcjs云存档登录入口  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  曝R星经典之作开发图 设计简陋但信息密集!  服务端验证_j*ascript输入检查  AO3最新镜像入口 Archive of Our Own官方平台访问  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  将HTML动态表格多行数据保存到Google Sheet的教程  快速CSGO开箱网站指南 CSGO开箱平台推荐  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  小米Civi 4录制视频过暗_小米Civi 4亮度优化  Go语言:非阻塞式判断标准输入(os.Stdin)是否有数据  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  J*aScript类型检查_j*ascript代码规范  J*aScript中向JSON对象添加新属性的正确姿势  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  PHP URL参数传递与500错误调试指南  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  PostgreSQL海量数据高效导入策略:Python与Django实践指南  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  QQ官网正版登录链接 QQ在线登录入口最新  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  mysql备份恢复性能优化_mysql备份恢复性能优化方法  163邮箱官方主页登录 直达网易邮箱登录核心页面  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  汽车之家官方网站官网入口_汽车之家网页版直接进入  抖音极速版最新版本 抖音极速版官方下载地址  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  Python多版本共存与虚拟环境管理深度指南  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  css链接悬停下划线样式如何自定义_使用::after结合content和transition  《刺客信条:影》PS5 Pro和Switch 2画面对比  Mac怎么锁定备忘录_Mac备忘录加密设置教程  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!