go: Broadcast Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:25
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : model.go
*/
package message
 
// JewelryMessage 珠宝行业标准广播消息
type JewelryMessage struct {
    Title             string // 消息标题
    Content           string // 消息内容
    Product           string // 产品名称
    Material          string // 原料
    Batch             string // 批次
    Standard          string // 质检标准
    WarehouseLocation string // 仓位
    MarketingContent  string // 营销内容
}
 
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:26
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : errors.go
*/
package core
 
import "errors"
 
// 广播相关错误
var (
    ErrSubscriberNil = errors.New("订阅者不能为空")
    ErrSubscriberDup = errors.New("订阅者已存在")
)
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:26
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : subscriber.go
*/
package iface
 
import "godesginpattern/broadcast/message"
 
// Subscriber 订阅者接口(所有业务系统必须实现)
type Subscriber interface {
    Name() string                         // 系统名称
    OnReceive(msg message.JewelryMessage) // 接收广播消息
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:27
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : broadcast.go
*/
package core
 
import (
    "fmt"
    "godesginpattern/broadcast/iface"
    "godesginpattern/broadcast/message"
    "sync"
)
 
// BroadcastEngine 广播引擎(单例)
type BroadcastEngine struct {
    subscribers []iface.Subscriber
    lock        sync.RWMutex // 线程安全
}
 
var instance *BroadcastEngine
var once sync.Once
 
// NewBroadcastEngine 单例模式获取全局广播引擎
func NewBroadcastEngine() *BroadcastEngine {
    once.Do(func() {
        instance = &BroadcastEngine{
            subscribers: make([]iface.Subscriber, 0),
        }
    })
    return instance
}
 
// Subscribe 订阅广播
func (e *BroadcastEngine) Subscribe(sub iface.Subscriber) error {
    if sub == nil {
        return ErrSubscriberNil
    }
 
    e.lock.Lock()
    defer e.lock.Unlock()
 
    // 去重
    for _, s := range e.subscribers {
        if s.Name() == sub.Name() {
            return ErrSubscriberDup
        }
    }
 
    e.subscribers = append(e.subscribers, sub)
    return nil
}
 
// Broadcast 向所有订阅者广播消息
func (e *BroadcastEngine) Broadcast(msg message.JewelryMessage) {
    e.lock.RLock()
    defer e.lock.RUnlock()
 
    fmt.Println("\n=============================================")
    fmt.Println("📢 广播引擎开始全局广播:", msg.Title)
    fmt.Println("📄 消息内容:", msg.Content)
    fmt.Println("=============================================\n")
 
    // 同步发送给所有订阅者
    for _, sub := range e.subscribers {
        sub.OnReceive(msg)
    }
}
  
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:27
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : procurement.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// ProcurementSystem 原料采购系统
type ProcurementSystem struct{}
 
func (p *ProcurementSystem) Name() string {
    return "原料采购系统"
}
 
func (p *ProcurementSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("📦【", p.Name(), "】已同步原料溯源:", msg.Material)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:28
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : production.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// ProductionSystem 生产加工系统
type ProductionSystem struct{}
 
func (p *ProductionSystem) Name() string {
    return "生产加工系统"
}
 
func (p *ProductionSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("⚙️【", p.Name(), "】已排产:", msg.Product, " 批次 ", msg.Batch)
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:28
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : quality.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// QCSystem 质量检测系统
type QCSystem struct{}
 
func (q *QCSystem) Name() string {
    return "质量检测系统"
}
 
func (q *QCSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("🔍【", q.Name(), "】已加载质检标准:", msg.Standard)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:29
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : warehouse.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// WarehouseSystem 仓储管理系统
type WarehouseSystem struct{}
 
func (w *WarehouseSystem) Name() string {
    return "仓储管理系统"
}
 
func (w *WarehouseSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("📦【", w.Name(), "】已预留仓位:", msg.WarehouseLocation)
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:29
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : sales.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// StoreSalesSystem 全国门店销售系统
type StoreSalesSystem struct{}
 
func (s *StoreSalesSystem) Name() string {
    return "全国门店销售系统"
}
 
func (s *StoreSalesSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("🏬【", s.Name(), "】已上架新品:", msg.Product)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:29
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : marketing.go
*/
package business
 
import (
    "fmt"
    "godesginpattern/broadcast/message"
)
 
// MemberMarketingSystem 会员营销系统
type MemberMarketingSystem struct{}
 
func (m *MemberMarketingSystem) Name() string {
    return "会员营销系统"
}
 
func (m *MemberMarketingSystem) OnReceive(msg message.JewelryMessage) {
    fmt.Println("🎯【", m.Name(), "】已推送:", msg.MarketingContent)
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Broadcast 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/6/8 22:30
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : broadcastbll.go
*/
package bll
 
import (
    "fmt"
    "godesginpattern/broadcast/business"
    "godesginpattern/broadcast/core"
    "godesginpattern/broadcast/iface"
    "godesginpattern/broadcast/message"
)
 
func BroadcastMain() {
    // 1. 获取全局单例广播引擎
    engine := core.NewBroadcastEngine()
 
    // 2. 初始化所有珠宝业务系统
    systems := []iface.Subscriber{
        &business.ProcurementSystem{},
        &business.ProductionSystem{},
        &business.QCSystem{},
        &business.WarehouseSystem{},
        &business.StoreSalesSystem{},
        &business.MemberMarketingSystem{},
    }
 
    // 3. 订阅广播
    for _, sys := range systems {
        if err := engine.Subscribe(sys); err != nil {
            fmt.Println("❌ 订阅失败:", sys.Name(), " 错误:", err.Error())
            continue
        }
        fmt.Println("✅ 已订阅:", sys.Name())
    }
 
    // 4. 构造标准广播消息
    msg := message.JewelryMessage{
        Title:             "2025春季冰种翡翠手镯全国上市",
        Content:           "天然A货翡翠,统一标准、统一定价、同步发售",
        Product:           "冰种翡翠手镯",
        Material:          "缅甸天然翡翠",
        Batch:             "JC20250415-001",
        Standard:          "GB/T 16552-2017 珠宝玉石鉴定",
        WarehouseLocation: "广州总部仓-A03-07",
        MarketingContent:  "VIP会员专享9折+免费刻字",
    }
 
    // 5. 执行全局广播
    engine.Broadcast(msg)
 
    fmt.Println("\n🎉 企业级广播完成:全业务链同步成功")
}
  

输出:

相关推荐
sycmancia1 小时前
Qt——Qt程序打包
开发语言·qt
郝学胜-神的一滴1 小时前
Qt 高级开发 026:QTabWidget御道,从筑基到化境
开发语言·c++·qt·程序人生·软件构建·用户界面
Alson_Code1 小时前
Spring AI-1.1.0
java·人工智能·后端·spring·ai编程
Jun6261 小时前
QT(14)-UBUNTU下QT使用串口
开发语言·qt·ubuntu
Jun6261 小时前
QT(16)-云端版本管理
开发语言·qt
ggaofeng1 小时前
试用zeroclaw
java·开发语言
我爱cope2 小时前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展
~|Bernard|2 小时前
关于go语言中二维切片的append操作陷阱
开发语言·后端·golang
c++之路2 小时前
C/C++ 全链路编译工具汇总
c语言·开发语言·c++