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🎉 企业级广播完成:全业务链同步成功")
}
  

输出:

相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
2601_962055976 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
EXI-小洲6 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员6 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导6 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan6 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251497 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
Lost of 程序猿7 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
大衛說8 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
QQ_21696290968 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端