观察者模式通过接口和组合在Go中实现对象间一对多依赖,当主体状态变化时自动通知所有观察者。示例中EventManager管理Observer列表,支持注册、注销与通知,EmailService和LogService作为具体观察者接收消息。主函数模拟用户登录触发通知,输出显示注册的观察者收到事件,注销后不再接收。使用互斥锁可保证并发安全,建议异步处理通知以避免阻塞,适用于解耦事件发布与处理逻辑。
观察者模式是一种行为设计模式,适用于对象之间存在一对多依赖关系的场景,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。在 Go 语言中,虽然没有类和继承的概念,但通过接口和组合机制可以非常简洁地实现观察者模式。
核心是定义两个角色:主题(被观察者)和观察者。主题维护一组观察者,并提供注册、注销和通知的方法;观察者实现接收通知的接口。
示例代码:
type Observer interface {
Update(message string)
}
type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify(message string)
}
这里定义了 Observer 接口,包含一个 Update 方法用于接收更新消息;Subject 接口则提供了注册、注销和广播通知的能力。
以一个简单的事件通知系统为例,比如用户登录后需要通知日志服务、邮件服务等模块。
type EventManager struct {
observers
[]Observer
}
func (em *EventManager) Register(observer Observer) {
em.observers = append(em.observers, observer)
}
func (em *EventManager) Unregister(observer Observer) {
for i, obs := range em.observers {
if obs == observer {
em.observers = append(em.observers[:i], em.observers[i+1:]...)
break
}
}
}
func (em *EventManager) Notify(message string) {
for _, observer := range em.observers {
observer.Update(message)
}
}
// 具体观察者
type EmailService struct{}
func (e *EmailService) Update(message string) {
fmt.Println("EmailService received:", message)
}
type LogService struct{}
func (l *LogService) Update(message string) {
fmt.Println("LogService logged:", message)
}
上面实现了 EventManager 作为具体主题,管理多个观察者。两个具体观察者 EmailService 和 LogService 在收到通知时执行各自逻辑。
模拟用户登录后触发事件,通知所有监听该事件的服务。
func main() {
eventManager := &EventManager{}
emailSvc := &EmailService{}
logSvc := &LogService{}
// 注册观察者
eventManager.Register(emailSvc)
eventManager.Register(logSvc)
// 模拟用户登录
eventManager.Notify("User logged in")
// 取消某个观察者
eventManager.Unregister(emailSvc)
// 再次通知,此时只有日志服务会收到
eventManager.Notify("User updated profile")
}
输出结果:
EmailService received: User logged in可以看到,在注销邮箱服务后,它不再接收到后续的通知。
基本上就这些。Go 的接口和结构体组合让观察者模式实现变得轻量且灵活,适合用于解耦事件发布与处理逻辑,提升系统的可维护性和扩展性。
# go
# golang
# app
# ai
# 邮箱
# 结构体
# 循环
# 继承
# 接口
# 并发
# 对象
# 事件
# 异步
# 用户登录
# 适用于
# 是一种
# 互斥
# 多个
# 可以看到
# 为例
# 它不
# 或未
# 再接
相关文章:
动图在线制作网站有哪些,滑动动图图集怎么做?
网页设计网站制作软件,microsoft office哪个可以创建网页?
如何在橙子建站上传落地页?操作指南详解
如何快速选择适合个人网站的云服务器配置?
香港服务器租用费用高吗?如何避免常见误区?
如何快速生成凡客建站的专业级图册?
如何选择高性价比服务器搭建个人网站?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何基于PHP生成高效IDC网络公司建站源码?
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
如何快速生成高效建站系统源代码?
如何在腾讯云服务器上快速搭建个人网站?
淘宝制作网站有哪些,淘宝网官网主页?
,在苏州找工作,上哪个网站比较好?
小程序网站制作需要准备什么资料,如何制作小程序?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
建站之星后台密码遗忘或太弱?如何重置与强化?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
制作销售网站教学视频,销售网站有哪些?
建站主机服务器选型指南与性能优化方案解析
如何批量查询域名的建站时间记录?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
Android使用GridView实现日历的简单功能
网站制作公司排行榜,抖音怎样做个人官方网站
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何在西部数码注册域名并快速搭建网站?
如何快速上传建站程序避免常见错误?
如何零基础开发自助建站系统?完整教程解析
如何通过二级域名建站提升品牌影响力?
如何在建站宝盒中设置产品搜索功能?
常州企业网站制作公司,全国继续教育网怎么登录?
建站主机SSH密钥生成步骤及常见问题解答?
如何选择适合PHP云建站的开源框架?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何选择适配移动端的WAP自助建站平台?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何在阿里云部署织梦网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
西安专业网站制作公司有哪些,陕西省建行官方网站?
湖北网站制作公司有哪些,湖北清能集团官网?
如何设置并定期更换建站之星安全管理员密码?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
建站之星后台管理:高效配置与模板优化提升用户体验
如何规划企业建站流程的关键步骤?
C#如何在一个XML文件中查找并替换文本内容
网站制作软件免费下载安装,有哪些免费下载的软件网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。