全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

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

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

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

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

定义目标接口与已有类型

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

  • 目标接口:Notifier 要求有 Send(message string) 方法;
  • 已有类型:EmailSender 有 SendEmail(to, body string),SMSSender 有 SendSMS(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 


相关文章: 整合Supabase认证与Django模型:跨模式迁移的解决方案  c++ 获取系统当前时间 c++时间戳获取方法  12306几点到几点不能订票? | 官方最新系统维护时间全解析  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  J*aScript map 迭代中检测空数组元素的有效方法  圆通快递查询实时追踪 圆通物流包裹状态快速查看  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  python3时间如何用calendar输出?  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  Yii2模块参数配置指南:正确声明与访问模块级配置  c++如何使用Meson构建系统_c++比CMake更快的构建工具  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  excel怎么制作工资条 excel快速生成工资条的方法  小红书网页版入口链接分享 小红书官网直接进  Eclipse怎么运行工程_Eclipse工程运行配置说明  蛙漫安全无毒 官方认证的绿色入口  精准捕获:如何在页面中监听除特定元素外的所有点击事件  PHP教程:高效从URL路径中提取倒数第二个片段  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  TikTok网页版直接登录 TikTok网页端官方平台入口  CSS布局中意外空白:解决padding-top导致的顶部间距问题  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  优化Lar*el Docker镜像:Composer与PHP版本控制策略  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  Log4j Console Appender性能瓶颈与高并发优化策略  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  ACG动漫视频网入口 ACG动漫*免费正版观看地址  实现全屏滚动与导航点:专业教程  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  J*aScript中如何高效提取对象指定属性  微信网页版官方入口教程 微信网页版网页版快速登录步骤  如何使用Node.js csv 包按条件移除含空字段的CSV记录  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  学习通在线学习平台 学习通网页版直接进入课程中心  Kafka Streams中基于消息头条件过滤消息的实现指南  mcjs网页版在线存档 mcjs云存档登录入口  如何仅使用CSS更改登录界面背景图像图标的颜色  怎么搭建一个php网站源码_搭php网站源码搭建教程  J*a应用程序首次运行自动创建文件与目录的最佳实践  微信语音通话掉线如何解决 微信语音通话稳定优化方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。