go: Observer Pattern

项目结构:

Go 复制代码
/*
# 版权所有  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)
}
Go 复制代码
/*
# 版权所有  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 subject
 
import (
    "fmt"
    "godesginpattern/observer/observer"
    "sync"
)
 
type JewelryStore struct {
    name      string
    observers []observer.Observer
    mu        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)
    }
}
Go 复制代码
/*
# 版权所有  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 entity
 
import "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 entity
 
import "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 entity
 
import "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
}
Go 复制代码
/*
# 版权所有  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 service
 
import (
    "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)
}

调用:

Go 复制代码
/*
# 版权所有  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 bll
 
import (
    "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天!")
}

输出:

相关推荐
小年糕是糕手1 小时前
【C/C++刷题集】栈、stack、队列、queue核心精讲
c语言·开发语言·数据结构·数据库·c++·算法·蓝桥杯
机跃1 小时前
指针(c++)
开发语言·c++
代码羊羊1 小时前
Rust Panic 深入全解:不可恢复错误的处理与原理
开发语言·后端·rust
枫叶丹41 小时前
【HarmonyOS 6.0】Call Service Kit VoIP接口Wearable设备支持详解:从手机到手表,VoIP通话的全场景延伸
开发语言·华为·智能手机·harmonyos
jjjava2.01 小时前
Java多线程编程:从入门到实战
java·开发语言
Fanfanaas1 小时前
Linux 系统编程 进程篇 (六)
linux·服务器·c语言·开发语言
小年糕是糕手1 小时前
【C/C++刷题集】顺序表、vector、链表、list核心精讲
c语言·开发语言·数据结构·c++·算法·leetcode·蓝桥杯
会编程的土豆1 小时前
从 C/C++ 视角快速上手 Go 语言:核心差异与避坑指南
c语言·开发语言·c++·后端·golang
小白学大数据1 小时前
Python 3.7 高并发爬虫:接口请求与页面解析并发处理
开发语言·爬虫·python