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

推荐订阅源

云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
腾讯CDC
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Martin Fowler
Martin Fowler
A
About on SuperTechFans
博客园 - 叶小钗

博客园 - ®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: 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(涂聚文)