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

适配器模式的核心
是让不兼容的接口能一起工作——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
相关栏目:
【
科技资讯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实现单选按钮与关联输入框的联动禁用教程


2025-12-12
浏览次数:次
返回列表