go: Handshaking Pattern

项目结构:

展示了一个珠宝企业级系统中基于"握手模式"(Handshaking Pattern)的Go语言实现。系统通过JewelryWorkshop领域实体实现负载控制,当工坊达到最大负载(5个订单)时拒绝新订单。核心组件包括:

  1. 订单处理服务(OrderService)负责订单提交与完成
  2. 工坊(Workshop)通过Handshake()方法自检负载状态
  3. 材料管理、质检、财务等配套服务 调用示例演示了订单全生命周期处理: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"))
}
  

输出: