惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
WordPress大学
WordPress大学
博客园_首页
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
The Cloudflare Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tenable Blog
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
博客园 - 三生石上(FineUI控件)
Recent Commits to openclaw:main
Recent Commits to openclaw:main
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
Security Latest
Security Latest
小众软件
小众软件
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
量子位
P
Privacy & Cybersecurity Law Blog
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
V2EX - 技术
V2EX - 技术
C
Cyber Attacks, Cyber Crime and Cyber Security
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
U
Unit 42
腾讯CDC
博客园 - 聂微东
博客园 - 【当耐特】
B
Blog
P
Proofpoint News Feed
B
Blog RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - ®Geovin Du Dream Park™

go: Functional Options Pattern go:Timing Functions Pattern python: Timing Functions Pattern go: Steady-State Pattern python: Steady-State Pattern go: Handshaking Pattern python: Handshaking Pattern go: Fail-Fast Pattern python: Fail-Fast Pattern I go: Deadline Pattern python: Deadline Pattern go: Circuit-Breaker Pattern python: Circuit-Breaker Pattern go: Bulkheads Pattern python: Bulkheads Pattern go: Push & Pull Pattern python: Push & Pull Pattern python: Publish/Subscribe Pattern II go: Publish/Subscribe Pattern python: Publish/Subscribe Pattern go: Futures & Promises Pattern python: Futures & Promises Pattern go: Worker Pool Pattern go:Pipeline Pattern python: Worker Pool Pattern python: Pipeline Pattern go: Fan-Out Pattern python: Fan-Out Pattern go: Fan-In Pattern python: Fan-In Pattern Fan-In go: Producer Consumer  Pattern python: Producer Consumer Pattern go: Parallelism Pattern python: Parallelism Pattern go: Reactor Pattern python: Reactor Pattern go: Generators Pattern python: speech to text offline python: Generators Pattern go: Coroutines Pattern python:Coroutines Pattern go: Broadcast Pattern python: Broadcast Pattern python: Bounded Parallelism Pattern go: Bounded Parallelism Pattern python: N-Barrier Pattern go: N-Barrier Pattern python: Semaphore Pattern go: Semaphore Pattern python: Read-Write Lock Pattern go: Read-Write Lock Pattern python: Monitor Pattern go: Monitor Pattern python: Mutex Pattern go: Lock/Mutex Pattern Python: Condition Variable Pattern go:Condition Variable Pattern python: Registry Pattern python: Interpreter Pattern go: Interpreter Pattern go: Registry Pattern go: Memento Pattern go: Command Pattern go: State Pattern go:Template Method Pattern go: Strategy Pattern go: Visitor Pattern go: Observer Pattern go: Iterator Pattern go: Chain of Responsibility Pattern go: Proxy Pattern go:Decorator Pattern go: Facade Pattern go: Flyweight Pattern go: Composite Pattern go: Singleton Pattern go: Prototype Pattern go: Bridge Pattern go: Adapter Pattern go: Builder Pattern 密码进行加盐哈希 using CSharp,Python,Go,Java go: Abstract Factory Pattern go: Model,Interface,DAL ,Factory,BLL using mysql go: Simple Factory Pattern go: Factory Method Pattern go: goLang 在Windows环境搭建Go语言开发环境 CSharp: Parallel Extensions cpp: class python: 蝴蝶跟随鼠标 javascript: 中国历史人物热力分布图using echart javascript: 中国历史人物热力图 python: 初养龙虾微信纯文字自动回复using workBuddy python: object 入门 python: Factory Method Pattern python: Simple Factory Pattern python: Abstract Factory Pattern 区域化 代码 python: Null Object Pattern python: Builder Pattern python: Adapter Pattern
go: Mediator Pattern
®Geovin Du D · 2026-04-22 · via 博客园 - ®Geovin Du Dream Park™

项目结构:

image

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator Pattern 中介者模式  go get -u go.uber.org/zap
# 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:02
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : config.go
*/
package config

const (
	AppName   = "jewelry-trading-system"
	LogLevel  = "info"
	MonitorOn = true
)


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:06
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : errors.go
*/
package errs

import "errors"

var (
	InvalidArgument = errors.New("invalid argument")
	NotFound        = errors.New("not found")
	InternalError   = errors.New("internal error")
)


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:05
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : logger.go
*/
package logger

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"godesginpattern/mediator/config"
	"os"
)

var log *zap.Logger

func Init() {
	encoderCfg := zapcore.EncoderConfig{
		TimeKey:       "time",
		LevelKey:      "level",
		NameKey:       "logger",
		CallerKey:     "caller",
		MessageKey:    "msg",
		StacktraceKey: "stack",
		EncodeTime:    zapcore.ISO8601TimeEncoder,
		EncodeLevel:   zapcore.LowercaseLevelEncoder,
		EncodeCaller:  zapcore.ShortCallerEncoder,
	}

	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(encoderCfg),
		zapcore.AddSync(os.Stdout),
		zap.InfoLevel,
	)

	log = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
	defer log.Sync()

	Info(config.AppName + " logger initialized")
}

func Info(msg string, fields ...zap.Field)  { log.Info(msg, fields...) }
func Error(msg string, fields ...zap.Field) { log.Error(msg, fields...) }
func Debug(msg string, fields ...zap.Field) { log.Debug(msg, fields...) }
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : errors.go
*/
package mediator

import "godesginpattern/mediator/common/errs"

var (
	ErrTraderNotFound = errs.NotFound
	ErrEmptyMessage   = errs.InvalidArgument
)


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:03
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : interface.go
*/
package mediator

// Trader 所有交易角色必须实现
type Trader interface {
	Name() string
	Receive(message string) error
}

// Mediator 中介者抽象
type Mediator interface {
	Register(t Trader)
	Send(from, to, msg string) error
}



/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:03
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : mediator.go
*/
package mediator

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"sync"
)

type jewelryMediator struct {
	traders map[string]Trader
	mu      sync.RWMutex
}

func NewJewelryMediator() Mediator {
	return &jewelryMediator{
		traders: make(map[string]Trader),
	}
}

func (m *jewelryMediator) Register(t Trader) {
	m.mu.Lock()
	defer m.mu.Unlock()
	m.traders[t.Name()] = t
	logger.Info("trader registered", zap.String("name", t.Name()))
}

func (m *jewelryMediator) Send(from, to, msg string) error {
	IncMessage()

	if msg == "" {
		IncError()
		logger.Error("empty message not allowed")
		return ErrEmptyMessage
	}

	m.mu.RLock()
	target, ok := m.traders[to]
	m.mu.RUnlock()

	if !ok {
		IncError()
		logger.Error("trader not found", zap.String("to", to))
		return ErrTraderNotFound
	}

	forwardMsg := "[转发] " + from + " → " + msg
	if err := target.Receive(forwardMsg); err != nil {
		IncError()
		logger.Error("receive failed", zap.String("trader", to), zap.Error(err))
		return err
	}

	logger.Info("message sent", zap.String("from", from), zap.String("to", to))
	return nil
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : monitor.go
*/
package mediator

import (
	"godesginpattern/mediator/config"
	"sync/atomic"
)

var (
	totalMsg atomic.Int64
	errorMsg atomic.Int64
)

func IncMessage() {
	if config.MonitorOn {
		totalMsg.Add(1)
	}
}

func IncError() {
	if config.MonitorOn {
		errorMsg.Add(1)
	}
}

func GetMetrics() (total int64, err int64) {
	return totalMsg.Load(), errorMsg.Load()
}
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : appraiser.go
*/
package trader

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"godesginpattern/mediator/mediator"
)

type Appraiser struct{ BaseTrader }

func NewAppraiser(name string, m mediator.Mediator) mediator.Trader {
	a := &Appraiser{BaseTrader: NewBaseTrader(name, m)}
	m.Register(a)
	return a
}
func (a *Appraiser) Receive(msg string) error {
	logger.Info("appraiser received", zap.String("name", a.Name()), zap.String("msg", msg))
	return nil
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:05
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : auction.go
*/
package trader

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"godesginpattern/mediator/mediator"
)

type AuctionHouse struct{ BaseTrader }

func NewAuctionHouse(name string, m mediator.Mediator) mediator.Trader {
	ah := &AuctionHouse{BaseTrader: NewBaseTrader(name, m)}
	m.Register(ah)
	return ah
}
func (ah *AuctionHouse) Receive(msg string) error {
	logger.Info("auction received", zap.String("name", ah.Name()), zap.String("msg", msg))
	return nil
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : base.go
*/
package trader

import "godesginpattern/mediator/mediator"

type BaseTrader struct {
	name string
	m    mediator.Mediator
}

func NewBaseTrader(name string, m mediator.Mediator) BaseTrader {
	return BaseTrader{name: name, m: m}
}

func (b *BaseTrader) Name() string {
	return b.name
}

func (b *BaseTrader) Send(to, msg string) error {
	return b.m.Send(b.name, to, msg)
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : buyer.go
*/
package trader

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"godesginpattern/mediator/mediator"
)

type Buyer struct{ BaseTrader }

func NewBuyer(name string, m mediator.Mediator) mediator.Trader {
	b := &Buyer{BaseTrader: NewBaseTrader(name, m)}
	m.Register(b)
	return b
}

func (b *Buyer) Receive(msg string) error {
	logger.Info("buyer received", zap.String("name", b.Name()), zap.String("msg", msg))
	return nil
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:04
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : seller.go
*/
package trader

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"godesginpattern/mediator/mediator"
)

type Seller struct{ BaseTrader }

func NewSeller(name string, m mediator.Mediator) mediator.Trader {
	s := &Seller{BaseTrader: NewBaseTrader(name, m)}
	m.Register(s)
	return s
}
func (s *Seller) Receive(msg string) error {
	logger.Info("seller received", zap.String("name", s.Name()), zap.String("msg", msg))
	return nil
}

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mediator 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:33
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : mediatorbll.go

mediator
├── go.mod
├── go.sum
├── config/              # 配置
│   └── config.go
├── internal/               # 内部包(外部不可访问)
│   ├── mediator/           # 中介者核心层(协调层)
│   │   ├── interface.go    # 中介者 + 同事接口
│   │   ├── mediator.go     # 中介者实现
│   │   └── errors.go       # 错误定义
│   │   └── monitor.go   # 监控
│   ├── trader/             # 交易角色层(买家/卖家/鉴定师/拍卖行)
│   │   ├── base.go         # 公共角色基类
│   │   ├── buyer.go
│   │   ├── seller.go
│   │   ├── appraiser.go
│   │   └── auction.go
│   └── common/             # 公共包
│       ├── logger/logger.go      # 日志
│       └── errs/errors.go       # 统一错误
├── main.go
└── main_test.go         # 单元测试 + Mock
*/
package bll

import (
	"go.uber.org/zap"
	"godesginpattern/mediator/common/logger"
	"godesginpattern/mediator/mediator"
	"godesginpattern/mediator/trader"
)

func MediatorMain() {
	logger.Init()
	m := mediator.NewJewelryMediator()

	// 自动注册
	buyer := trader.NewBuyer("张三", m)
	seller := trader.NewSeller("李四", m)
	appraiser := trader.NewAppraiser("王鉴定师", m)
	auction := trader.NewAuctionHouse("高端珠宝行", m)

	// 交易流程
	_ = seller.(*trader.Seller).Send("王鉴定师", "请求鉴定翡翠手镯")
	_ = appraiser.(*trader.Appraiser).Send("李四", "A货,估值50万")
	_ = appraiser.(*trader.Appraiser).Send("高端珠宝行", "可上拍")
	_ = auction.(*trader.AuctionHouse).Send("张三", "下周三拍卖,起拍价30万")
	_ = buyer.(*trader.Buyer).Send("李四", "我出价40万收购")

	// 监控输出
	total, err := mediator.GetMetrics()
	logger.Info("monitor metrics", zap.Int64("total_msg", total), zap.Int64("error", err))

}

输出:

image

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)