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

适配器模式的核心
是让不兼容的接口能一起工作——Golang 没有继承,但通过组合和接口嵌入,实现起来更轻量、更清晰。
先明确你希望统一对外暴露的接口(Target),再确认已有类型(Adaptee)的行为。比如:
适配器不是改造原有类型,而是新建一个结构体,内嵌或持有 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小时内与您取得联系。