当前位置: 首页 > news >正文

go: Observer Pattern

项目结构:

image

 

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:48
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : observer.go
*/
package observer// Observer 观察者接口
type Observer interface {Update(message string)GetName() string
}// Subject 主题接口
type Subject interface {Register(observer Observer)UnRegister(observer Observer)Notify(message string)
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_store.go
*/
package subjectimport ("fmt""godesginpattern/observer/observer""sync"
)type JewelryStore struct {name      stringobservers []observer.Observermu        sync.RWMutex
}func NewJewelryStore(name string) *JewelryStore {return &JewelryStore{name:      name,observers: make([]observer.Observer, 0),}
}func (j *JewelryStore) Register(observer observer.Observer) {j.mu.Lock()defer j.mu.Unlock()j.observers = append(j.observers, observer)fmt.Printf("【%s】新关注者:%s\n", j.name, observer.GetName())
}func (j *JewelryStore) UnRegister(observer observer.Observer) {j.mu.Lock()defer j.mu.Unlock()for i, obs := range j.observers {if obs.GetName() == observer.GetName() {j.observers = append(j.observers[:i], j.observers[i+1:]...)fmt.Printf("【%s】取消关注者:%s\n", j.name, observer.GetName())break}}
}func (j *JewelryStore) Notify(message string) {j.mu.RLock()defer j.mu.RUnlock()fmt.Printf("\n【%s】发布新动态:%s\n", j.name, message)for _, observer := range j.observers {observer.Update(message)}
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : lover.go
*/
package entityimport "fmt"type Lover struct {name string
}func NewLover(name string) *Lover {return &Lover{name: name}
}func (l *Lover) Update(message string) {fmt.Printf("📣 珠宝爱好者【%s】收到通知:%s → 我要去看看新款!\n", l.name, message)
}func (l *Lover) GetName() string {return l.name
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : collector.go
*/
package entityimport "fmt"type Collector struct {name string
}func NewCollector(name string) *Collector {return &Collector{name: name}
}func (c *Collector) Update(message string) {fmt.Printf("📣 珠宝收藏家【%s】收到通知:%s → 稀缺款我要立刻收藏!\n", c.name, message)
}func (c *Collector) GetName() string {return c.name
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : dealer.go
*/
package entityimport "fmt"type Dealer struct {name string
}func NewDealer(name string) *Dealer {return &Dealer{name: name}
}func (d *Dealer) Update(message string) {fmt.Printf("📣 珠宝经销商【%s】收到通知:%s → 准备批量采购!\n", d.name, message)
}func (d *Dealer) GetName() string {return d.name
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : notify_service.go
*/
package serviceimport ("godesginpattern/observer/observer""godesginpattern/observer/subject"
)type NotifyService struct {store *subject.JewelryStore
}func NewNotifyService(store *subject.JewelryStore) *NotifyService {return &NotifyService{store: store}
}func (s *NotifyService) Register(observer observer.Observer) {s.store.Register(observer)
}func (s *NotifyService) UnRegister(observer observer.Observer) {s.store.UnRegister(observer)
}func (s *NotifyService) Notify(message string) {s.store.Notify(message)
}

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Observer Pattern 观察者模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/22 22:56
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : observerbll.go
observer/
├── go.mod                  # 项目模块定义
├── internal/               # 内部包(外部不可引用)
│   ├── observer/           # 观察者核心层(接口定义)
│   │   └── observer.go     # Observer/Subject 接口
│   ├── subject/            # 主题实现层(珠宝店)
│   │   └── jewelry_store.go
│   ├── entity/             # 实体层(观察者角色)
│   │   ├── lover.go
│   │   ├── collector.go
│   │   └── dealer.go
│   └── service/            # 业务逻辑层
│       └── notify_service.go
└── main.go                 # 程序入口分层职责说明
observer(抽象层):定义接口,不依赖任何具体实现
subject(主题层):实现珠宝店主题,管理观察者
entity(实体层):实现各类观察者角色,纯业务响应
service(业务层):封装通知逻辑,解耦入口与实现
main.go(入口层):依赖注入、流程编排
*/
package bllimport ("godesginpattern/observer/entity""godesginpattern/observer/service""godesginpattern/observer/subject"
)func ObserverMain() {// 1. 创建珠宝店store := subject.NewJewelryStore("璀璨珠宝旗舰店")// 2. 初始化服务notifySrv := service.NewNotifyService(store)// 3. 创建观察者lover := entity.NewLover("张三")collector := entity.NewCollector("李大爷")dealer := entity.NewDealer("王总")// 4. 注册关注notifySrv.Register(lover)notifySrv.Register(collector)notifySrv.Register(dealer)// 5. 新品通知notifySrv.Notify("新款红宝石项链到货,限量50件!")// 6. 取消关注notifySrv.UnRegister(lover)// 7. 打折通知notifySrv.Notify("全场珠宝8折优惠,限时3天!")
}

  

输出:

image

 

http://www.jsqmd.com/news/684260/

相关文章:

  • # 用AI写代码的人越来越多,但能判断AI对不对的人没多几个
  • 流量来了接不住 才是很多跨境卖家真正的难题
  • 别再死磕AT模式了!用Seata TCC模式搞定高并发库存扣减(Spring Cloud Alibaba实战)
  • 最危险的不是刺头,而是“模范员工“
  • 不教而战,边学边教:大模型在线策略蒸馏的机制、优势与挑战
  • 并发编程专题(一)
  • 周薪近3万!Anthropic“重金”挖科学家,只为给AI“纠偏”
  • 如何3分钟掌握安卓虚拟定位:FakeLocation的终极隐私保护指南
  • 别再死记硬背了!用C++ TinyWebServer项目,一次性搞懂Reactor和Proactor模式的区别
  • Python实现移动平均平滑技术的时间序列分析
  • 我做了一个花粉星球:把风、花粉与地球写成一封浪漫的情书
  • 手把手教你配置RK3588单/双PMIC方案,避免烧芯片的坑(附完整DTS代码)
  • ChatGPT Images 2.0让AI设计离“靠谱”只剩一步!
  • Docker镜像体积暴增300%的真相(工业级精简指南:从2.4GB到87MB实录)
  • SPSSAU调节作用怎么做:软件操作步骤与结果指标解读
  • 【maaath】Flutter for OpenHarmony 跨平台工程日志能力实战:分级日志输出与本地文件持久化
  • 抖音批量下载终极指南:三分钟搞定无水印视频采集
  • python基础03基本数据类型
  • 深入理解 MCP (Model Context Protocol):开启 AI Agent 交互新时代
  • cocos小游戏的打包与发布
  • 告别版本地狱:用Anaconda为你的RTX 3060/3070/3080显卡创建独立的TensorFlow 2.4.0虚拟环境
  • 告别硬件烧录!用RT-Thread Simulator在Visual Studio 2022上快速调试LVGL界面
  • Python动态特性与Monkey Patching实战解析
  • 一站式开源解决方案:douyin-downloader 革命性解决抖音内容批量下载与智能管理难题
  • 结构体进阶
  • 解放你的QQ音乐收藏:QMCDecode轻松解密加密音频格式
  • Pandas数据过滤与聚合:深入分析Uber纽约出行数据
  • AI UX范式正在悄然崩塌:从“命令执行”到“意图发现”的60年未有之大迁徙
  • Mythos架构被22岁小伙“逆推”开源了!MoE和注意力借鉴DeepSeek
  • Sherpa Onnx 跨平台语音处理架构设计与技术实现