项目结构:

展示了一个珠宝企业级系统中基于"握手模式"(Handshaking Pattern)的Go语言实现。系统通过JewelryWorkshop领域实体实现负载控制,当工坊达到最大负载(5个订单)时拒绝新订单。核心组件包括:
- 订单处理服务(OrderService)负责订单提交与完成
- 工坊(Workshop)通过Handshake()方法自检负载状态
- 材料管理、质检、财务等配套服务 调用示例演示了订单全生命周期处理:7个订单中前5个被接受,后2个因过载被拒;完成2个订单后,被拒订单可重新提交。系统采用分层架构,各模块职责明确,通过握手机制确保系统稳定性。
Go
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:31
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : config.go
*/
package config
const (
WorkshopMaxLoad = 5 // 握手模式最大负载
)
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:38
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : jewelry_enums.go
*/
package enums
type JewelryType string
type OrderStatus string
const (
DIAMOND_RING JewelryType = "钻戒"
GOLD_BRACELET JewelryType = "黄金手镯"
JADE_PENDANT JewelryType = "翡翠吊坠"
RUBY_NECKLACE JewelryType = "红宝石项链"
PLATINUM_RING JewelryType = "铂金戒指"
SAPPHIRE_EARRING JewelryType = "蓝宝石耳环"
PEARL_NECKLACE JewelryType = "珍珠项链"
)
const (
PRODUCING OrderStatus = "生产中"
COMPLETED OrderStatus = "已完成"
REJECTED OrderStatus = "已拒绝"
QC_PASS OrderStatus = "质检通过"
SETTLED OrderStatus = "已结算"
)
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:32
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : exceptions.go
*/
package exceptions
import "errors"
var (
WorkshopOverload = errors.New("工坊已满负荷")
OrderNotFound = errors.New("订单不存在")
)
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:32
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : workshop.go
*/
package domain
import (
"godesginpattern/handshaking/exceptions"
)
// JewelryWorkshop 珠宝工坊领域实体
type JewelryWorkshop struct {
MaxLoad int
CurrentOrders []string
}
// NewWorkshop 构造函数:负载阈值由上层服务传入,domain 不依赖 config
func NewWorkshop(maxLoad int) *JewelryWorkshop {
return &JewelryWorkshop{
MaxLoad: maxLoad,
CurrentOrders: []string{},
}
}
// Handshake 握手模式核心校验:组件自检负载,过载返回不可接单
func (w *JewelryWorkshop) Handshake() bool {
return len(w.CurrentOrders) < w.MaxLoad
}
// AcceptOrder 承接加工单,握手失败返回过载异常
func (w *JewelryWorkshop) AcceptOrder(orderID string) error {
if !w.Handshake() {
return exceptions.WorkshopOverload
}
w.CurrentOrders = append(w.CurrentOrders, orderID)
return nil
}
// CompleteOrder 完成加工释放工位负载
func (w *JewelryWorkshop) CompleteOrder(orderID string) error {
for i, id := range w.CurrentOrders {
if id == orderID {
w.CurrentOrders = append(w.CurrentOrders[:i], w.CurrentOrders[i+1:]...)
return nil
}
}
return exceptions.OrderNotFound
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:36
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : order_repo.go
*/
package repository
import (
"godesginpattern/handshaking/enums"
)
type Order struct {
OrderID string
JewelryType enums.JewelryType
Customer string
Status enums.OrderStatus
}
var OrderDB = map[string]Order{}
func SaveOrder(o Order) {
OrderDB[o.OrderID] = o
}
func GetOrder(id string) (Order, bool) {
o, ok := OrderDB[id]
return o, ok
}
func UpdateStatus(id string, status enums.OrderStatus) {
o := OrderDB[id]
o.Status = status
OrderDB[id] = o
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:39
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : order_service.go
*/
package service
import (
"godesginpattern/handshaking/domain"
"godesginpattern/handshaking/enums"
"godesginpattern/handshaking/repository"
)
type OrderService struct {
Workshop *domain.JewelryWorkshop
}
func (s *OrderService) SubmitOrder(orderID string, jt enums.JewelryType, customer string) string {
err := s.Workshop.AcceptOrder(orderID)
if err != nil {
return "❌ 订单" + orderID + " 被拒绝:" + err.Error()
}
repository.SaveOrder(repository.Order{
OrderID: orderID,
JewelryType: jt,
Customer: customer,
Status: enums.PRODUCING,
})
return "✅ 订单" + orderID + " 已接受"
}
func (s *OrderService) CompleteOrder(orderID string) string {
err := s.Workshop.CompleteOrder(orderID)
if err != nil {
return "⚠️ " + err.Error()
}
repository.UpdateStatus(orderID, enums.COMPLETED)
return "🏆 订单" + orderID + " 加工完成"
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:40
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : material_service.go
*/
package service
type MaterialService struct{}
func (m *MaterialService) UseMaterial(orderID string, material string) string {
return "📦 订单" + orderID + " 使用原料:" + material
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Handshaking 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/7/1 21:41
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : workshop_api.go
*/
package api
import (
"godesginpattern/handshaking/config"
"godesginpattern/handshaking/domain"
"godesginpattern/handshaking/enums"
"godesginpattern/handshaking/service"
)
type WorkshopAPI struct {
OrderSvc *service.OrderService
MaterialSvc *service.MaterialService
QCSvc *service.QCService
Finance *service.FinanceService
}
func NewAPI() *WorkshopAPI {
// 配置仅在应用入口传入,domain 无感知
workshop := domain.NewWorkshop(config.WorkshopMaxLoad)
return &WorkshopAPI{
OrderSvc: &service.OrderService{Workshop: workshop},
MaterialSvc: &service.MaterialService{},
QCSvc: &service.QCService{},
Finance: &service.FinanceService{},
}
}
func (api *WorkshopAPI) SubmitOrder(orderID string, jt enums.JewelryType, customer string) string {
return api.OrderSvc.SubmitOrder(orderID, jt, customer)
}
func (api *WorkshopAPI) CompleteOrder(orderID string) string {
return api.OrderSvc.CompleteOrder(orderID)
}
func (api *WorkshopAPI) UseMaterial(orderID string, material string) string {
return api.MaterialSvc.UseMaterial(orderID, material)
}
func (api *WorkshopAPI) QC(orderID string) string {
return api.QCSvc.Pass(orderID)
}
func (api *WorkshopAPI) Settle(orderID string) string {
return api.Finance.Settle(orderID)
}
调用:
Go
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/7/1 21:43
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : handshakingbll.go
*/
package bll
import (
"godesginpattern/handshaking/api"
"godesginpattern/handshaking/enums"
)
func HandshakingMain() {
println("===== 珠宝企业级系统启动(握手模式)=====\n")
api := api.NewAPI()
orders := []struct {
orderID string
jt enums.JewelryType
customer string
}{
{"ORD001", enums.DIAMOND_RING, "张先生"},
{"ORD002", enums.GOLD_BRACELET, "李女士"},
{"ORD003", enums.JADE_PENDANT, "王小姐"},
{"ORD004", enums.RUBY_NECKLACE, "刘先生"},
{"ORD005", enums.PLATINUM_RING, "陈女士"},
{"ORD006", enums.SAPPHIRE_EARRING, "赵先生"},
{"ORD007", enums.PEARL_NECKLACE, "孙女士"},
}
println("----- 接收客户订单 -----")
for _, o := range orders {
println(api.SubmitOrder(o.orderID, o.jt, o.customer))
}
println("\n----- 完成2个订单 -----")
println(api.CompleteOrder("ORD001"))
println(api.CompleteOrder("ORD002"))
println("\n----- 重新接收被拒订单 -----")
println(api.SubmitOrder("ORD006", enums.SAPPHIRE_EARRING, "赵先生"))
println(api.SubmitOrder("ORD007", enums.PEARL_NECKLACE, "孙女士"))
println("\n----- 原料使用 -----")
println(api.UseMaterial("ORD001", "18K黄金 + 钻石"))
println("\n----- 质检 -----")
println(api.QC("ORD001"))
println("\n----- 财务结算 -----")
println(api.Settle("ORD001"))
}
输出:
